【问题标题】:AttributeError: 'NoneType' object has no attribute height in BST pythons heightAttributeError:“NoneType”对象在 BST pythons 高度中没有属性高度
【发布时间】:2017-08-07 17:16:47
【问题描述】:

这是我在 python 中创建 BST 的代码,一切正常,但是当我访问 height 函数时,它会给出类似“AttributeError: 'NoneType' object has no attribute height”的错误,我是在 python 中创建数据结构的新手,任何帮助都会被欣赏

 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()

【问题讨论】:

  • 对于叶节点,self.data 不是 None ,但 self.leftself.right 将是 None ,因此问题。

标签: python data-structures tree height binary-search-tree


【解决方案1】:

对于树中的叶节点,self.data 将设置为叶节点的值,但 self.leftself.right 将设置为 None。但即使在此之前,也可能存在左侧或右侧子节点为 None 的节点,并且由于我们尝试该节点并获得其高度,因此我们在 NoneType 上得到 AttributeError

height的代码中-

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

当递归到达一个节点,其中leftright 节点为None,上述代码将失败,因为它会尝试访问self.left.height()self.right.height(),其中之一是None。

我们可以添加一个简单的检查来查看 self.leftself.right 是否为 None ,并据此从中获取高度。

【讨论】:

    【解决方案2】:

    如果您收到这样的错误,则表示您尝试使用None 的字段。因为你的树是有限的,所以你有一个没有任何数据的叶子。我看到你在代码中有一个位置 self.data 字段被分配给一个值,但 self.leftself.right 没有。同时,您在height 方法中获取字段的值,您只检查self.data。这对我来说没有意义。

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

    【讨论】:

      猜你喜欢
      • 2021-12-20
      • 2019-01-01
      • 2021-12-26
      • 2019-07-23
      • 2018-05-13
      • 2020-09-07
      • 2017-05-03
      • 2023-03-16
      • 2018-07-14
      相关资源
      最近更新 更多