1. 二叉树直径问题解析
543题是LeetCode Hot 100中的经典二叉树问题,要求计算二叉树的直径。所谓直径,指的是树中任意两个节点间最长路径的长度。这个路径可能穿过根节点,也可能不穿过。例如,对于二叉树:
code复制 1
/ \
2 3
/ \
4 5
最长路径是[4,2,1,3]或[5,2,1,3],长度为3。
注意:直径计算的是路径上的边数而非节点数。比如上述例子的直径是3而不是4。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 解题思路与算法选择
2.1 深度优先搜索(DFS)的应用
这个问题最自然的解法是采用后序遍历的DFS策略。因为在二叉树中,最长路径必然由某个节点的左右子树的最深路径组合而成。我们需要:
- 递归计算每个节点的左子树深度
- 递归计算右子树深度
- 将左右深度相加得到当前节点的潜在直径
- 维护一个全局变量记录最大直径
python复制class Solution:
def diameterOfBinaryTree(self, root: TreeNode) -> int:
self.diameter = 0
def depth(node):
if not node:
return 0
left = depth(node.left)
right = depth(node.right)
self.diameter = max(self.diameter, left + right)
return max(left, right) + 1
depth(root)
return self.diameter
2.2 时间复杂度分析
该算法的时间复杂度是O(n),其中n是树中的节点数。因为我们需要访问每个节点一次。空间复杂度取决于递归的深度,最坏情况下(树退化为链表)是O(n)。
3. 关键实现细节
3.1 递归终止条件
递归的base case是当节点为None时返回0,这表示空树的深度为0。这是递归能够正确返回的关键。
3.2 直径的更新时机
在计算完左右子树的深度后立即更新直径:
python复制self.diameter = max(self.diameter, left + right)
这一步确保了我们在遍历每个节点时都检查了通过该节点的最长路径。
3.3 返回值的处理
递归函数返回的是当前节点的深度(max(left, right) + 1),而不是直径。这是容易混淆的点。
4. 常见错误与调试技巧
4.1 混淆深度和直径
新手常犯的错误是将递归函数的返回值当作直径返回。实际上应该维护一个全局变量来跟踪最大直径。
4.2 边界条件处理
特殊测试用例需要注意:
- 空树(应返回0)
- 只有根节点的树(应返回0)
- 完全左斜或右斜的树
4.3 递归栈溢出
对于极端不平衡的树(如链表状的树),递归可能导致栈溢出。虽然Python默认递归深度足够处理大多数情况,但在其他语言中可能需要考虑迭代解法。
5. 算法优化与变种
5.1 迭代解法
可以使用后序遍历的迭代实现来避免递归:
python复制def diameterOfBinaryTree(root):
if not root:
return 0
stack = []
node = root
last_visited = None
diameter = 0
depth = {None: 0}
while stack or node:
if node:
stack.append(node)
node = node.left
else:
peek_node = stack[-1]
if peek_node.right and last_visited != peek_node.right:
node = peek_node.right
else:
left = depth[peek_node.left]
right = depth[peek_node.right]
diameter = max(diameter, left + right)
depth[peek_node] = max(left, right) + 1
last_visited = stack.pop()
return diameter
5.2 相关题目扩展
掌握了这个解法后,可以解决一系列类似问题:
- 二叉树的最大深度(104题)
- 平衡二叉树判断(110题)
- 二叉树中的最大路径和(124题)
6. 实际应用场景
二叉树直径问题虽然看似简单,但其解法思想在以下场景中有重要应用:
- 网络拓扑中的最长通信路径计算
- 文件系统目录树的分析
- 生物信息学中的进化树研究
- 游戏AI中的决策树评估
我在实际项目中曾用类似算法优化过组织结构树的展示逻辑,通过计算部门树的直径来确定最佳的布局方案,使得汇报路径最长的部门能够获得更多的展示空间。
