题目:给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。 思路:基于二叉树的结构,对于一条路径上的点,要么是做向上传递信息的,要么是向两个子树传递信息。在求最大路径和的时候, 需要传递的是节点的 value,在求最长路径时,求的是这条路径的长度,每增加一个节点就增加 1,所以这里比最大路径和相对简 单,每个节点只需要向上返回自己的最大路径即可。
class Solution(object):
def diameterOfBinaryTree(self, root: TreeNode) -> int:
def dfs(root):
if root is None:
return 0
# 计算左右子树分别的最大路径长度
left_value = dfs(root.left)
right_value = dfs(root.right)
# 计算当前节点为中间节点,其左右子树连接成路径时的路径长度
if root.left and root.right:
self.max_diameter = max(self.max_diameter, left_value + right_value + 2)
elif root.left or root.right:
self.max_diameter = max(self.max_diameter, left_value + right_value + 1)
else:
return 0
return max(left_value, right_value) + 1
if root is None:
return 0
self.max_diameter = 0
dfs(root)
return self.max_diameter