本文共 1325 字,大约阅读时间需要 4 分钟。
给定一棵二叉树,你需要计算它的直径长度。直径长度定义为任意两个结点之间路径长度的最大值。路径可能穿过根节点,也可能不穿过根节点。
初步的错误想法是直接将左右子树的高度相加,以此得到直径长度。然而,这种方法并不总是正确,因为树中可能存在一条路径,这条路径并不经过根节点,而这一条路径的长度可能比左右子树高度之和更长。
正确的思路是将每个节点都视为根节点,分别计算这棵以该节点为根的树的直径长度,然后取最大的那个值作为当前树的直径长度。
递归公式为:
这个递归公式考虑了如果路径穿过根节点以及不穿过根节点的情况。每次递归返回后,更新全局最大直径。因此,正确的直径长度是所有这些情况中的最大值。
使用递归遍历整棵树,每次计算当前节点的左右子树的直径长度,同时计算高度,然后比较并维护一个堆的最大值。在递归返回时,更新全局最大直径值。
class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = rightclass Solution: def diameterOfBinaryTree(self, root:TreeNode) -> int: maxd = [0] # 使用闭包包装,避免变量修改问题 def dfs(node): if not node: return 0 left = dfs(node.left) right = dfs(node.right) if left + right > maxd[0]: maxd[0] = left + right # 返回当前树的高度 return max(left, right) + 1 dfs(root) return maxd[0]
这个递归方法确保每个可能的路径都被考量,无论路径是否经过根节点,最终返回的maxd是正确的直径长度。
转载地址:http://ptlrz.baihongyu.com/