我试图实现一个递归方法来计算二叉树的高度。这是" 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
有人看到了这个问题吗?
答案 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