AttributeError:'NoneType'对象在BST pythons height中没有属性高度

时间:2017-08-07 17:16:48

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

这是我在python中创建BST的代码一切正常工作但是当我访问高度函数时它会给出错误,如“AttributeError:'NoneType'对象没有属性高度”我是新手在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()

2 个答案:

答案 0 :(得分:1)

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

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(),其中一个是无。

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

答案 1 :(得分:0)

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

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