[英]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.