Python ';非类型';对象没有属性';高度';
我试图找到一个BST的高度,但它给出了一个错误,比如Python ';非类型';对象没有属性';高度';,python,python-3.x,binary-search-tree,Python,Python 3.x,Binary Search Tree,我试图找到一个BST的高度,但它给出了一个错误,比如“NoneType”对象没有属性“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.ro
“NoneType”对象没有属性“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())
BST级:
定义初始值(self,val):
self.left=无
self.right=无
self.root=val
def插入(自身,数据):
如果self.root==无:
self.root=BST(数据)
elif数据>self.root:
如果self.right==无:
self.right=BST(数据)
其他:
self.right.insert(数据)
elif数据
当你到达这一行时
return 1 + max(self.left.height(), self.right.height())
然后在某一点上,self.left
变得没有定义(尽管不是在一开始)。您可以通过在该语句之前添加print(self.left)
来检查这一点,您将看到在错误消息之前输出的None
这意味着,当定义了
self.root
时,您的基本情况需要包括self.left
(可能还有self.right
),以便在到达此行时,在任何一点上都不包含这些内容。
return 1 + max(self.left.height(), self.right.height())
然后在某一点上,self.left
变得没有定义(尽管不是在一开始)。您可以通过在该语句之前添加print(self.left)
来检查这一点,您将看到在错误消息之前输出的None
这意味着在定义self.root
的同时,您的基本情况需要包括self.left
(也可能包括self.right
),以便在任何时候都不包含这些内容。替换此行:
return 1 + max(self.left.height(), self.right.height())
与
替换此行:
return 1 + max(self.left.height(), self.right.height())
与
您需要将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)
你的身高方法是:
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)
这需要更改的原因是,您一直在树的下方调用height,从而一直到树的右侧和左侧的
None
,一直到树的底部。因此,这需要检查self.right
和self.left
是否具有高度属性。如果类型为None
,则它们不会返回,因此当两者都为None
时,我们将返回所有返回 您需要将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)
你的身高方法是:
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)
这需要更改的原因是,您一直在树的下方调用height,从而一直到树的右侧和左侧的
None
,一直到树的底部。因此,这需要检查self.right
和self.left
是否具有高度属性。如果类型为None
,则它们不会返回,因此当两者都为None
时,我们将返回所有返回 您应该在方法height
中添加一些检查,self.left
或self.right
可以是None
您应该在方法height
中添加一些检查,self.left
或self.right
可以是None