2017-08-07 55 views
1

这是我在Python中创建一切BST代码工作正常,但是当我访问高度功能,它提供了错误,如“AttributeError的:‘NoneType’对象有没有属性高度“我是新来的Python中的数据结构的任何帮助将appriciatedAttributeError的:“NoneType”对象在BST蟒蛇高度没有属性高度

class Node: 
     def __init__(self, data): 
      self.left = None 
      self.right = None 
      self.data = data 
     def insert(self, data): 
      if self.data: 
       if data < self.data: 
        if self.left is None: 
         self.left = Node(data) 
        else: 
         self.left.insert(data) 
       elif data > self.data: 
        if self.right is None: 
         self.right = Node(data) 
        else: 
         self.right.insert(data) 
      else: 
       self.data = data 

     def print_tree(self): 

      if self.left: 
       self.left.print_tree() 
      print (self.data) 
      if self.right: 
       self.right.print_tree() 

     def height(self): 
      if self.data is None: 
       return 0 
      else: 
       return 1 + max(self.left.height(),self.right.height()) 

    root = Node(8) 
    root.insert(3) 
    root.insert(10) 
    root.insert(1) 
    root.insert(6) 
    root.insert(4) 
    root.insert(7) 
    root.insert(14) 
    root.insert(13) 
    root.print_tree() 
    root.height() 
+0

对于叶节点,'self.data'不是无,但'self.left'和'self.right'是无,因此这个问题。 –

回答

1

叶节点在你的树,self.data将被设置为叶节点的值,但self.leftself.rightNone。但即使在此之前,可以有节点,其中左或右的孩子是None因为我们尝试节点,并得到其高度,我们得到NoneTypeAttributeError

在用于height代码 -

def height(self): 
    if self.data is None: 
     return 0 
    else: 
     return 1 + max(self.left.height(),self.right.height()) 

当递归到达节点,其中任leftright节点是无,上面的代码会失败,因为它会尝试访问self.left.height()self.right.height(),和一个他们是无。

我们可以添加一个简单的检查,看看是否self.leftself.rightNone,并基于它得到它的高度。

+0

谢谢Machane! –

0

如果你遇到一个错误,它意味着你尝试使用None的领域。因为你的树是有限的,你有一个没有任何数据的叶子。我看你有没有在self.data字段被分配到一个值,但self.leftself.right没有代码的地方。同时,您在height方法中获得的字段值,您只能检查self.data。这对我来说没有意义。

另外,我建议尝试pdb或其他调试工具。

相关问题