' NoneType'对象没有属性' height'

时间:2017-10-05 19:13:35

标签: python python-3.x binary-search-tree

我正在尝试找到BST的高度,但它会给出'NoneType' object has no attribute '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())

3 个答案:

答案 0 :(得分:1)

当你到达这一行

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

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

这意味着虽然定义了self.root,但您的基本案例需要包含self.left(可能还有self.right),因此任何时候都不包含任何内容。

答案 1 :(得分: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)

答案 2 :(得分: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时,我们会一直返回。