【问题标题】:Binary Search Tree insert method fails to insert any nodes二叉搜索树插入方法无法插入任何节点
【发布时间】:2019-06-17 01:23:47
【问题描述】:

我正在尝试实现一个 BST,它在对 insert() 的调用执行后将 root 值再次设置为 None,此时它应该更改为第一次调用后插入的第一个值,并且之后创建一棵树。关于为什么会发生这种情况的任何建议?

class Node:
    def __init__(self, value=None, left=None, right=None):
        self.value = value
        self.left = left
        self.right = right

    def __str__(self):
        return str(self.value)


def insert(root,value):
    if root is None:
        root = Node(value)
        print(1)
    elif value <= root.value:
        root.left = insert(root.left, value)
        print(2)
    else:
        root.right = insert(root.right, value)
        print(3)


def search(root,value):
    if root is None:
        print("False")
    elif root.value == value:
        print("True")
    elif value <= root.value:
        return search(root.left, value)
    else:
        return search(root.right, value)


root = None

insert(root,15)
insert(root,10)
insert(root,25)

search(root,10)

输出:

1
1
1
False

【问题讨论】:

    标签: python-3.x data-structures binary-search-tree


    【解决方案1】:

    当您在函数中进行诸如root = Node(value) 之类的赋值时,它不会像您预期的那样修改外部作用域中的root 对象。相反,它将insert 函数内的本地root 变量重新分配给一个新的Node 对象,该对象在函数返回时超出范围。

    一种解决方案是返回您创建的新根对象并在调用范围内重新分配它,覆盖旧根的值。这对于递归赋值也很重要,以便正确设置 .left.right 属性。

    这里是固定代码:

    class Node:
        def __init__(self, value=None, left=None, right=None):
            self.value = value
            self.left = left
            self.right = right
    
        def __str__(self):
            return str(self.value)
    
    
    def insert(root,value):
        if root is None:
            root = Node(value)
            print(1)
        elif value <= root.value:
            root.left = insert(root.left, value)
            print(2)
        else:
            root.right = insert(root.right, value)
            print(3)
    
        return root
        #^^^^^^^^^^
    
    
    def search(root,value):
        if root is None:
            print("False")
        elif root.value == value:
            print("True")
        elif value <= root.value:
            return search(root.left, value)
        else:
            return search(root.right, value)
    
    
    root = None
    root = insert(root,15)
    #^^^^^^
    root = insert(root,10)
    root = insert(root,25)
    search(root,10)
    search(root,15)
    search(root,25)
    

    输出:

    1
    1
    2
    1
    3
    True
    True
    True
    

    我还建议您从函数内部消除打印,尽管我知道您可能处于调试模式。这是一个快速清理:

    class Node:
        def __init__(self, value=None, left=None, right=None):
            self.value = value
            self.left = left
            self.right = right
    
        def __str__(self):
            return str(self.value)
    
    
    def insert(root,value):
        if not root:
            root = Node(value)
        elif value <= root.value:
            root.left = insert(root.left, value)
        else:
            root.right = insert(root.right, value)
    
        return root
    
    def search(root, value):
        if not root:
            return False
        elif root.value == value:
            return True
        elif value <= root.value:
            return search(root.left, value)
    
        return search(root.right, value)
    
    
    if __name__ == "__main__":
        root = None
        root = insert(root, 15)
        root = insert(root, 10)
        root = insert(root, 25)
        root = insert(root, 27)
        print(root, root.left, root.right, root.right.right)
        print(search(root, 10))
        print(search(root, 15))
        print(search(root, 25))
        print(search(root, 27))
        print(search(root, 12))
    

    【讨论】:

    • 谢谢,我之前试过同样的方法,但忘记添加return语句。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-02
    • 1970-01-01
    • 2022-11-30
    • 2011-07-14
    • 2022-01-13
    • 1970-01-01
    相关资源
    最近更新 更多