我正在研究一个著名的问题,称为二叉树的直径。我知道这已经讨论了很多次(二叉树的直径),但解释似乎不正确。特别是,单个节点树应该返回 0,而不是 1(我从 Leetcode 自己的检查器中检查过)。无论如何,这是问题陈述:
给定一棵二叉树,您需要计算树的直径长度。二叉树的直径是树中任意两个节点之间最长路径的长度。此路径可能会或可能不会通过根。
答案分别是 0、1 和 5。乍一看,似乎计算左子树的边数和右子树的数应该得出答案。
所以我从后序递归开始(自下而上):
max_diameter = 0
def getDiameter(node):
if node is NULL:
return 0
left_diameter = getDiameter(node.left)
right_diameter = getDiameter(node.right)
max_diameter = max(left + right, max_diameter)
到目前为止,一切都很好。但是代码不起作用,我很难理解那里的一些解决方案。例如:
class Solution(object):
def diameterOfBinaryTree(self, root):
"""
:type root: TreeNode
:rtype: int
"""
self.ans = 0
def depth(p):
if not p: return 0
left, right = depth(p.left), depth(p.right)
self.ans = max(self.ans, left+right)
return 1 + max(left, right)
depth(root)
return self.ans
为什么要比较左子树和右子树?为什么+1?还有,有人说找高度,有人说找深度。这令人困惑,我觉得人们只是在抛出术语......任何澄清都是有帮助的。