思路:
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明:叶子节点是指没有子节点的节点。
示例 1:
输入:root = [3,9,20,null,null,15,7]
输出:2
示例 2:
输入:root = [2,null,3,null,4,null,5,null,6]
输出:5
提示:
树中节点数的范围在 [0, 105] 内
-1000 <= Node.val <= 1000
参考文章
思路:
做这道题之前可以看 《LeetCode 104和559 二叉树和N叉树的最大深度》 这道题,其实是大同小异的,这里也都是分递归法和迭代法来做。
递归法:
这道题使用递归法的时候需要注意,求最小深度,并不能像求最大深度一样每次递归直接取较大的左右儿子为根结点的子树的深度,因为这个时候当前节点可能不存在左右儿子。如果当前节点同时不存在左右节点,那么它就是叶子节点,应该返回深度为1;如果当前节点仅存在一个儿子,那么就应该返回这个儿子为根节点的子树的最小深度;如果当前节点存在两个儿子,就直接取较小的左右儿子为根结点的子树的深度。
Java代码:
class Solution {
public int minDepth(TreeNode root) {
if (root == null)
return 0;
int leftDepth = minDepth(root.left);
int rightDepth = minDepth(root.right);
if (root.left == null)
//只有一个儿子,返回这个儿子为根节点的子树的最小深度
return rightDepth + 1;
if (root.right == null)
//只有一个儿子,返回这个儿子为根节点的子树的最小深度
return leftDepth + 1;
//到这里就说明存在两个儿子
return Math.min(leftDepth, rightDepth) + 1;
}
}
迭代法:
迭代法与求最大深度非常相似,只不过当我们遇到第一个叶节点就说明当前层数其实就是最小深度,直接返回当前层数就行了。
class Solution {
public int minDepth(TreeNode root) {
if (root == null)
return 0;
Deque<TreeNode> deque = new LinkedList<>();
deque.offer(root);
int depth = 0;
while (!deque.isEmpty()) {
depth++;
int size = deque.size();
for (int i = 0; i < size; i++) {
TreeNode rnNode = deque.poll();
if (rnNode.left == null && rnNode.right == null)// 关键代码在这里!!!
return depth;
if (rnNode.left != null)
deque.offer(rnNode.left);
if (rnNode.right != null)
deque.offer(rnNode.right);
}
}
return depth;
}
}