我正在编写代码以在Python中实现二进制搜索树。我在编写insert
函数时遇到问题,该函数应在树中正确的顺序位置添加一个新节点。我用两种不同的方式编写它:insertNode1
可以正常工作(正确地在树上执行插入操作),但是insertNode2
不能正确执行插入操作。当我使用insertNode1
和insertNode2
对树进行InOrderTraversal时,事实证明,“ insertNode1”产生完整的树,而“ insertNode2”只产生根。
为什么insertNode1
成功而insertNode2
失败,这两个功能之间的有意义区别是什么?
这是我的代码:
def insert(self,val):
if not self.root:
self.root = TreeNode(val)
else:
self.insertNode2(self.root, val)
def insertNode1(self,node, val):
if val < node.val:
if not node.left:
node.left = TreeNode(val)
else:
self.insertNode1(node.left,val)
else:
if not node.right:
node.right = TreeNode(val)
else:
self.insertNode1(node.right, val)
def insertNode2(self, node, val):
if not node:
node = TreeNode(val)
else:
if node.val > val:
self.insertNode2(node.left, val)
else:
self.insertNode2(node.right, val)
答案 0 :(得分:0)
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
等于: