二叉树的高度

时间:2016-04-08 13:02:39

标签: python python-3.x

我试图实现一个递归方法来计算二叉树的高度。这是" height" -code:

def height(self):
    if self.root==None:
        return 0
    return max(height(self.root.left), height(self.root.right))+1

当我尝试调用该函数时,我收到以下错误信息:

NameError: name 'height' is not defined

有人看到了这个问题吗?

2 个答案:

答案 0 :(得分:8)

这是您的类的方法,因此您必须从实例(self)或类本身调用它。虽然它不会像您想象的那样工作,除非您将其定义为staticmethod或更改您的通话,例如

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

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

请注意,您不应该使用==None进行比较(kudos to timgeb)。而且你必须检查是否存在子节点。而且你的算法不起作用,所以我稍微改了一下。

示例:

class Node:
    def __init__(self, root=None, left=None, right=None):
        self.root = root
        self.left = left
        self.right = right

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


# Create a binary tree of height 4 using the binary-heap property
tree = [Node() for _ in range(10)]
root = tree[0]

for i in range(len(tree)):
    l_child_idx, r_child_idx = (i + 1) * 2 - 1, (i + 1) * 2
    root_idx = (i + 1) // 2
    if root_idx: 
        tree[i].root = tree[root_idx]
    if l_child_idx < len(tree):
        tree[i].left = tree[l_child_idx]
    if r_child_idx < len(tree):
        tree[i].right = tree[r_child_idx]

print(root.height())  # -> 4

答案 1 :(得分:0)

我不确定如何定义二叉树。但是在树节点上,您通常只有一个根和多个儿子。我觉得这种方法导致无限循环。 self.root.left和self.root.right正是我的兄弟和我......

在这里你可能不得不从实例self.root.left和self.root.right调用该方法而没有额外的参数:

def height(self):
    if self.root==None:
        return 0
    return max(self.root.left.height(), self.root.right.height())+1