Python ';非类型';对象没有属性';高度';

Python ';非类型';对象没有属性';高度';,python,python-3.x,binary-search-tree,Python,Python 3.x,Binary Search Tree,我试图找到一个BST的高度,但它给出了一个错误,比如“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.ro

我试图找到一个BST的高度,但它给出了一个错误,比如
“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())
BST级:
定义初始值(self,val):
self.left=无
self.right=无
self.root=val
def插入(自身,数据):
如果self.root==无:
self.root=BST(数据)
elif数据>self.root:
如果self.right==无:
self.right=BST(数据)
其他:
self.right.insert(数据)
elif数据
当你到达这一行时

return 1 + max(self.left.height(), self.right.height())
然后在某一点上,
self.left
变得没有定义(尽管不是在一开始)。您可以通过在该语句之前添加
print(self.left)
来检查这一点,您将看到在错误消息之前输出的
None


这意味着,当定义了
self.root
时,您的基本情况需要包括
self.left
(可能还有
self.right
),以便在到达此行时,在任何一点上都不包含这些内容。

return 1 + max(self.left.height(), self.right.height())
然后在某一点上,
self.left
变得没有定义(尽管不是在一开始)。您可以通过在该语句之前添加
print(self.left)
来检查这一点,您将看到在错误消息之前输出的
None

这意味着在定义
self.root
的同时,您的基本情况需要包括
self.left
(也可能包括
self.right
),以便在任何时候都不包含这些内容。

替换此行:

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

替换此行:

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


您需要将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)
你的身高方法是:

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)

这需要更改的原因是,您一直在树的下方调用height,从而一直到树的右侧和左侧的
None
,一直到树的底部。因此,这需要检查
self.right
self.left
是否具有高度属性。如果类型为
None
,则它们不会返回,因此当两者都为
None
时,我们将返回所有返回

您需要将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)
你的身高方法是:

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)

这需要更改的原因是,您一直在树的下方调用height,从而一直到树的右侧和左侧的
None
,一直到树的底部。因此,这需要检查
self.right
self.left
是否具有高度属性。如果类型为
None
,则它们不会返回,因此当两者都为
None
时,我们将返回所有返回

您应该在方法
height
中添加一些检查,
self.left
self.right
可以是
None
您应该在方法
height
中添加一些检查,
self.left
self.right
可以是
None