insertNode2
неправильно выполняет вставку, как ожидалось, из-за строки node = TreeNode(val)
, которая делает чисто локальное присвоение node
.Этот новый объект никогда не устанавливается в родительское свойство .left
или .right
и теряется при возврате функции.Корневой узел не будет изменен ни при каком запуске этой функции.
Либо используйте уже работающий insertNode1
, либо добавьте оператор return node
к insertNode2
и сделайте присваивание в вызове родительской функциипростор для нового ребенка.
Вот фрагмент, демонстрирующий, как это можно сделать:
class TreeNode:
def __init__(self, val, left=None, right=None):
self.val = val
self.left = left
self.right = right
class BinarySearchTree:
@staticmethod
def p(root, depth=0):
if root:
print(" " * depth + str(root.val))
BinarySearchTree.p(root.left, depth + 2)
BinarySearchTree.p(root.right, depth + 2)
@staticmethod
def insert(node, val):
if not node:
return TreeNode(val)
elif node.val > val:
node.left = BinarySearchTree.insert(node.left, val)
else:
node.right = BinarySearchTree.insert(node.right, val)
return node
if __name__ == "__main__":
root = TreeNode(5)
for n in [2, 1, 3, 7, 9, 6]:
BinarySearchTree.insert(root, n)
BinarySearchTree.p(root)
Вывод:
5
2
1
3
7
6
9
Что составляет: