Algorithm 是否可以使用一个指针将节点插入BST?

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:

我不知道是否可以在没有尾随指针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:
        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