Algorithm 是否可以使用一个指针将节点插入BST?
我不知道是否可以在没有尾随指针y的情况下插入。这是我的密码:Algorithm 是否可以使用一个指针将节点插入BST?,algorithm,data-structures,binary-search-tree,Algorithm,Data Structures,Binary Search Tree,我不知道是否可以在没有尾随指针y的情况下插入。这是我的密码: def tree_insert(root, key): z = TreeNode(key) y = None x = root while x: y = x if z.val < x.val: x = x.left else: x = x.right if y is None:
def tree_insert(root, key):
z = TreeNode(key)
y = None
x = root
while x:
y = x
if z.val < x.val:
x = x.left
else:
x = x.right
if y is None:
root = z
elif z.val < y.val:
y.left = z
else:
y.right = z
def树插入(根,键):
z=TreeNode(键)
y=无
x=根
而x:
y=x
如果z.val
谢谢大家! 您的函数有一个问题:当函数分配
root=x
时,调用方将不知道它,因为root
是一个局部变量
你可以用很多方法来解决这个问题。一个是你有一个契约,函数总是返回根
要避免出现y
,您只需在知道它应该放在哪里时分配z
:
def tree_insert(root, key):
z = TreeNode(key)
if not root:
return z # new root
x = root
while True:
if z.val < x.val:
if not x.left:
x.left = z
return root
x = x.left
else:
if not x.right:
x.right = z
return root
x = x.right
如果将函数转换为递归函数,甚至可以保存更多变量:
def tree_insert(root, key):
if not root:
return TreeNode(key)
if key < root.val:
root.left = tree_insert(root.left, key)
else:
root.right = tree_insert(root.right, key)
return root
def树插入(根,键):
如果不是根目录:
返回树节点(键)
如果键
同样,此函数返回根,调用者必须考虑它。此函数不正确:当
root
为None时,调用者将永远无法看到插入的节点,因为root
是此函数中的局部变量。@Maras,这不会有帮助:主程序中的根目录在调用后仍然是None
。@trincot是的,我的错,函数外的指针不会改变。公平地说,我真的不明白这个问题的意义。您可以使用指向父级的附加指针(在本例中为y),也可以使用附加的if语句。在性能和内存消耗方面几乎没有什么区别。我猜作者想知道是否有更好的方法来编写该函数,不幸的是,答案是否定的。@Maras,请看我的答案,了解一些想法……对不起,我是编程新手。你说的“合同”是什么意思?我应该怎么做才能全局更改原始代码中的根?使用合同,我的意思是你同意你自己或任何人使用你的代码,函数调用方必须使用返回值来设置(全局)根。我理解。非常感谢你!
def tree_insert(root, key):
if not root:
return TreeNode(key)
if key < root.val:
root.left = tree_insert(root.left, key)
else:
root.right = tree_insert(root.right, key)
return root