繁体   English   中英

Python 在实现二叉搜索树时出错

[英]Error in Python when implementing binary search tree

我正在尝试使用 Python 实现二叉搜索树:

这是我的 tree_node 类:

class tree_node:
    def  __init__(self,val,rightChild,leftChild):
        self.val = val
        self.rightChild = rightChild
        self.leftChild = leftChild

这是我的二叉树类:

class binary_tree:
    def __init__(self,baseNode):
        self.baseNode = baseNode
    
    def addTreeNode(self,treeNode):
       current = self.baseNode
       while current:
             prev = current
             if treeNode.val < current.val:
                 current = current.rightChild
                 if prev.val < treeNode.val < current.val:
                     prev.rightChild = treeNode
                     treeNode.rightChild = current
                     break
             if treeNode.val > current.val:
                 current = current.leftChild
                 if prev.val<treeNode.val<current.val:
                     prev.leftChild = treeNode
                     treeNode.rightChild = current
       if treeNode.val<current.val:
             current.rightChild = treeNode
       elif treeNode.val>current.val:
             current.leftChild = treeNode
    
    def print_tree(self):
        currentL = self.baseNode
        currentR = self.baseNode
        while currentR:
           print("",currentR.val)
           currentR = currentR.rightChild
        while currentL:
            currentL = currentL.leftChild      
            print("",currentL.val)

我的主要:

zero = tree_node(0,None,None)
minusone = tree_node(-1,None,None)
one = tree_node(1,None,None)
minustwo = tree_node(-2,None,None)
two= tree_node(2,None,None)
bst = binary_tree(zero)
bst.addTreeNode(minustwo)
bst.addTreeNode(one)
bst.addTreeNode(two)
bst.addTreeNode(minusone)
bst.print_tree()

但是,当我尝试调用addTreeNode()方法时,它显示了一个

错误: while current.rightChild and current.leftChild属性错误:'NoneType 没有属性 rightChild'`。

如果我将bst.addTreeNode(minustwo)bst.addTreeNode(minusone)行翻转,它会按原样打印0 0 -1 -2 1 2所以我怀疑问题出在这些行中:

             if prev.val < treeNode.val < current.val:
                 prev.rightChild = treeNode
                 treeNode.rightChild = current
                 break

但我不明白为什么不应该是这样。

主要问题是在为current分配一个新引用之后,您的代码不会首先验证这个新引用不是None 它立即与current.val进行比较。 因此,如果current恰好在之前的赋值中变为None ,这将导致您得到的错误。

循环结束后会出现类似的问题——您可以从while条件中看到这一点。 然而,就在循环之后,您的代码再次访问current.val

要解决此问题,请完全删除那些以if prev.val < treeNode.val < current.val:或类似开头的最内层if块。 除了他们在没有首先确保current不是None的情况下访问current.val之外,其余的if块用新节点替换子树,这可能会破坏树的一部分。 这是没有意义的。 删除该代码。

还要确保如果current收到一个新值,则在检查while条件之前没有其他代码执行,甚至if条件也不执行。 所以第二个if应该变成一个elif

要修复循环的错误,您应该使用prev而不是current

更正后的代码:

    def addTreeNode(self,treeNode):
        current = self.baseNode
        prev = None
        while current:
            prev = current
            if treeNode.val < current.val:
                current = current.rightChild
            elif treeNode.val > current.val:
                current = current.leftChild
        if not prev:
            self.baseNode = treeNode    
        elif treeNode.val < prev.val:
            prev.rightChild = treeNode
        elif treeNode.val > prev.val:
            prev.leftChild = treeNode

我可能还应该警告您的print_tree方法不正确。 所以我在这里提供了一个横向打印的实现(逆时针旋转 90°):

    def print_tree(self):
        def dfs(node, indent=""):
            if node:
                dfs(node.rightChild, "  " + indent)
                print(indent, node.val)
                dfs(node.leftChild, "  " + indent)
        dfs(self.baseNode)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM