2017-10-05 55 views
1

我试图找到BST的高度,但它给出的错误如'NoneType' object has no attribute 'height'。我无法弄清楚错误。'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()) 
+1

您应该在方法'height','self.left'或'self.right'内添加一些检查,可以是'None' – PRMoureu

回答

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.rightself.left有高度的属性。如果类型为None,那么它们不会,所以当两者都是None时,我们会一路返回。

1

当你在某个时候到达这条线

return 1 + max(self.left.height(), self.right.height()) 

然后,self.left变得没有定义(虽然不是在一开始)。您可以通过在该语句前添加print(self.left)来检查该错误,并且您会在错误消息之前输出None

这意味着,虽然定义了self.root,但您的基本情况需要包括self.left(可能还有self.right),因此在任何时候都不会有这些无。

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) 
相关问题