最大深度算法
public int maxDepth(TreeNode root) {
if (root == null) return 0;
int left = maxDepth(root.left);
int right = maxDepth(root.right);
return Math.max(left, right) + 1;
}
最小深度算法
public int minDepth(TreeNode root) {
if (root == null) return 0;
int left = minDepth(root.left);
int right = minDepth(root.right);
// 关键区别在这里!
if (root.left == null && root.right == null) {
return 1;
}
if (root.left == null) {
return right + 1;
}
if (root.right == null) {
return left + 1;
}
return Math.min(left, right) + 1;
}
为什么逻辑不同?
核心区别:定义不同
- 最大深度:从根节点到最远叶子节点的最长路径上的节点数
- 最小深度:从根节点到最近叶子节点的最短路径上的节点数
关键场景:单子树情况
考虑这个树:
1
/
2
/
3
- 最大深度:最长路径是
1 → 2 → 3,深度为 3 - 最小深度:最近叶子节点是
3,深度为 3(因为没有其他叶子节点)
再看这个树:
1
/ \
2 3
/ \
4 5
- 最大深度:最长路径可能是
1 → 3 → 4或1 → 3 → 5,深度为 3 - 最小深度:最近叶子节点是
2,深度为 2
问题场景:为什么不能简单用 Math.min()
如果对下面这个树用简单的 Math.min(left, right) + 1:
1
/
2
- 左子树深度:1(节点2)
- 右子树深度:0(null)
Math.min(1, 0) + 1 = 1❌ 错误!
实际上最小深度应该是 2(路径 1 → 2),因为节点2是叶子节点。
最小深度的正确逻辑
最小深度需要特别处理以下情况:
- 左右子树都为空:当前节点是叶子节点,深度为1
- 左子树为空:只能走右子树,深度 = 右子树最小深度 + 1
- 右子树为空:只能走左子树,深度 = 左子树最小深度 + 1
- 左右子树都不为空:取两边的最小值 + 1
总结
| 方面 | 最大深度 | 最小深度 |
|---|---|---|
| 定义 | 到最远叶子 | 到最近叶子 |
| 空子树处理 | 直接用Math.max | 需要特殊判断 |
| 时间复杂度 | O(n) | O(n) |
| 空间复杂度 | O(h) | O(h) |
本质原因:对于最大深度,空子树(深度0)自然会被 Math.max() 排除;但对于最小深度,空子树(深度0)会被 Math.min() 选中,导致错误地认为空路径是有效路径,但实际上到达叶子节点才是有效的。

531

被折叠的 条评论
为什么被折叠?



