我正在尝试找到BST的高度,但它会给出'NoneType' object has no attribute 'height'
之类的错误。我无法弄清楚错误。
class BST:
def __init__(self,val):
self.left = None
self.right = None
self.root = val
def insert(self,data):
if self.root == None:
self.root = BST(data)
elif data > self.root:
if self.right == None:
self.right = BST(data)
else:
self.right.insert(data)
elif data < self.root:
if self.left == None:
self.left = BST(data)
else:
self.left.insert(data)
def inorder(self):
if self.left != None:
self.left.inorder()
print(self.root)
if self.right != None:
self.right.inorder()
def height(self):
if self.root == None:
return 0
else:
return 1 + max(self.left.height(), self.right.height())
t = BST(4)
t.insert(1)
t.insert(7)
t.insert(3)
t.insert(6)
t.insert(2)
t.insert(5)
t.inorder()
print(t.height())
答案 0 :(得分:1)
当你到达这一行
return 1 + max(self.left.height(), self.right.height())
然后在某些时候,self.left
变得没有定义(虽然不是一开始)。您可以在该语句之前添加print(self.left)
来检查此问题,并且您会在错误消息之前看到None
输出。
这意味着虽然定义了self.root
,但您的基本案例需要包含self.left
(可能还有self.right
),因此任何时候都不包含任何内容。
答案 1 :(得分:1)
替换此行:
return 1 + max(self.left.height(), self.right.height())
与
if hasattr(self.left, 'height'):
left_height = self.left.height()
if hasattr(self.right, 'height'):
right_height = self.right.height()
return 1 + max(left_height, right_height)
答案 2 :(得分:1)
您需要将init方法更改为:
def __init__(self,val):
self.left = None
self.right = None
self.root = val
self.rheight = 0
self.lheight = 0
你的身高方法就是这样:
def height(self):
if self.root == None:
return 0
else:
if hasattr(self.left, 'height'):
self.lheight = self.left.height()
if hasattr(self.right, 'height'):
self.rheight = self.right.height()
return 1 + max(self.lheight, self.rheight)
这需要改变的原因是,你在树的一直调用高度,从而一直到左侧的None
,一直到树的底部。那么这样做是检查self.right
和self.left
是否具有高度属性。如果类型为None
,则不会,因此当两者都为None
时,我们会一直返回。