[英]calculating depth of a binary tree in Python
我是编程新手,正在尝试用 Python 计算二叉树的深度。 我相信我的错误是因为 depth 是 Node 类的方法而不是常规函数。 我正在尝试学习 OOP 并希望使用一种方法。 这可能是一个新手错误......这是我的代码:
class Node:
def __init__(self, item, left=None, right=None):
"""(Node, object, Node, Node) -> NoneType
Initialize this node to store item and have children left and right.
"""
self.item = item
self.left = left
self.right = right
def depth(self):
if self.left == None and self.right == None:
return 1
return max(depth(self.left), depth(self.right)) + 1
i receive this error:
>>>b = Node(100)
>>>b.depth()
1
>>>a = Node(1, Node(2), Node(3))
>>>a.depth()
Traceback (most recent call last):
File "C:\Program Files\Wing IDE 101 4.1\src\debug\tserver\_sandbox.py", line 1, in <module>
# Used internally for debug sandbox under external interpreter
File "C:\Program Files\Wing IDE 101 4.1\src\debug\tserver\_sandbox.py", line 15, in depth
builtins.NameError: global name 'depth' is not defined
def depth(self):
if self.left == None and self.right == None:
return 1
return max(depth(self.left), depth(self.right)) + 1
应该
def depth(self):
return max(self.left.depth() if self.left else 0, self.right.depth() if self.right else 0) + 1
一个更易读的版本:
def depth(self):
left_depth = self.left.depth() if self.left else 0
right_depth = self.right.depth() if self.right else 0
return max(left_depth, right_depth) + 1
问题是没有函数depth
。 它是Node
对象的一个方法,因此您需要从对象本身(左右)调用它。 我将代码缩短为self.left.depth() if self.left else 0
和self.right.depth() if self.right else 0
以删除您以前拥有的检查(它们现在是隐式的),因为我相信完全有可能左边是None
而右边是Node
,反之亦然,这将导致原始代码抛出AttributeError
因为None
没有方法depth
。
编辑
回答关于<something> if <some condition> else <otherwise>
块的问题:
如果<some condition>
为真-y(视为真),则该行给出<something>
,如果<some condition>
为假-y(视为假),则给出<otherwise>
为了清楚起见,我建议您这样编写depth
方法:
def depth(self):
current_depth = 0
if self.left:
current_depth = max(current_depth, self.left.depth())
if self.right:
current_depth = max(current_depth, self.right.depth())
return current_depth + 1
错误来自这一行:
return max(depth(self.left), depth(self.right)) + 1
您将深度用作函数并尝试将其应用于左右节点。 因为左右节点也是节点,所以有depth方法。
您应该像这样调用 depth 方法:
return max(self.left.depth(), self.right.depth()) + 1
self 参数被隐式传递给 depth 方法,但是将它与点运算符一起使用会告诉 Python 此方法属于一个 Node 实例,而不是其他未绑定到对象的函数。
您需要考虑四种情况:
您已经涵盖了案例 1 和案例 4,但错过了案例 2 和 3。修复方法:
# Return height of tree rooted at this node.
def depth(self):
if self.left == None and self.right == None:
return 1
elif self.left == None:
return self.right.depth() + 1
elif self.right == None:
return self.left.depth() + 1
else:
return max(self.left.depth(), self.right.depth()) + 1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.