问题描述
- Given a binary tree, find its minimum depth.
The minimum depth is the number of nodes along the shortest path from the root node down to the nearest leaf node. - Note: A leaf is a node with no children.
Example:
Given binary tree [3,9,20,null,null,15,7],3
/ \
9 20
/ \
15 7
return its minimum depth = 2.- 地址
问题分析
- 该题与 LeetCode 104. Maximum Depth of Binary Tree 类似,只不过该题是求从最小深度。
- 该题的坑便是 最小深度定义为从根节点到叶子节点中距离最小的那一个。不能简单按照求最大深度那样求。
- 解题方法:
- DFS: 会遍历所有节点
- BFS:其实这是一个求图的最短路径问题,用BFS显然更为合适,这样无需遍历所有节点,第一次到了某一节点的左右孩子都为空(叶子结点)时,便可以直接返回该节点所在深度。根据层序遍历特点,一定是最短的。
经验教训
- 从该题看DFS与BFS的适用场景
代码实现
- DFS
public int minDepth(TreeNode root) {
if (root == null) {
return 0;
}
if (root.left == null) {
return 1 + minDepth(root.right);
}
if (root.right == null) {
return 1 + minDepth(root.left);
}
return 1 + Math.min(minDepth(root.left), minDepth(root.right));
}
- BFS
public int minDepth(TreeNode root) {
if (root == null) {
return 0;
}
LinkedList<TreeNode> queue = new LinkedList<>();
//初始化
queue.add(root);
int level = 0;
while (! queue.isEmpty()) {
int levelSize = queue.size();
for (int i = 0; i < levelSize; ++i) {
TreeNode popNode = queue.pop();
if (popNode.left != null) {
queue.add(popNode.left);
}
if (popNode.right != null) {
queue.add(popNode.right);
}
if (popNode.left == null && popNode.right == null) {//一旦遇到叶子结点,直接返回当前层深度
return level + 1;
}
}
++level;
}
return level;
}