问题概述
给定一棵二叉树,找到它的最小深度。
最小深度 是从根节点到最近叶子节点的最短路径上的节点数量。
可视化说明
示例 1:最小深度 = 2
3
/ \
9 20
/ \
15 7
最短叶子路径:3 → 9(深度 2)
示例 2:最小深度 = 5
2
\
3
\
4
\
5
\
6
最短叶子路径:2 → 3 → 4 → 5 → 6(深度 5)
关键说明
- 深度计算的是 节点数,不是边数
- 叶子节点是 没有子节点 的节点
- 最小深度是最短的根到叶子路径
解法 1:递归(DFS)
工作原理
使用 DFS 遍历两侧子树,注意缺失子节点的处理:
python
class Solution:
def minDepth(self, root):
if not root:
return 0
if not root.left and not root.right:
return 1
left_depth = self.minDepth(root.left) if root.left else float('inf')
right_depth = self.minDepth(root.right) if root.right else float('inf')
return 1 + min(left_depth, right_depth)
复杂度分析
- 时间复杂度: O(n) - 每个节点访问一次
- 空间复杂度: O(h) - 递归栈深度
适用场景
- 简单直观的 DFS
- 理解最小深度逻辑
- 仍是 O(n),但无法提前退出
解法 2:BFS(推荐)
工作原理
使用 BFS,在遇到第一个叶子时立即返回(最早的最小深度):
python
from collections import deque
class Solution:
def minDepth(self, root):
if not root:
return 0
queue = deque([(root, 1)])
while queue:
node, depth = queue.popleft()
if not node.left and not node.right:
return depth
if node.left:
queue.append((node.left, depth + 1))
if node.right:
queue.append((node.right, depth + 1))
return 0
复杂度分析
- 时间复杂度: O(n) - 每个节点访问一次;由于提前退出,实际更快
- 空间复杂度: O(n) - 队列最多容纳一层的节点
适用场景
- 推荐 - 遇到首个叶子即可返回
- 最小深度较小时通常更快
- 迭代,易于理解
对比
| 方法 | 时间 | 空间 | 最佳适用 |
|---|---|---|---|
| DFS(递归) | O(n) | O(h) | 学习,逻辑直观 |
| BFS(提前返回) | O(n) | O(n) | 推荐 - 提前返回,通常更快 |
总结
最小深度用 BFS 最快:层序遍历遇到的第一个叶子就是答案。DFS 也可以,但无法像 BFS 那样早停。