文章前言:如果有小白同学还是对于二叉树不太清楚,作者推荐:
后序遍历求解
public int minDepth(TreeNode node) {
if (node == null) {
return 0;
}
int d1 = minDepth(node.left);
int d2 = minDepth(node.right);
//不应该再把为 null 子树的深度 0 参与最小值比较
//第一种写法:
//if (d1 == 0 || d2 == 0) {
// return d1 + d2 + 1;
//}
//第二种写法:
if(d1==0){//当右子树为NULL
return d2+1;//返回左子树深度+1
}
if(d2==0){//当左子树为NULL
return d1+1;//返回右子树深度+1
}
//只有两边子树都不为null时
return Integer.min(d1, d2) + 1;
}
相较于求最大深度,应当考虑:
当右子树为 null,应当返回左子树深度加一
当左子树为 null,应当返回右子树深度加一
上面两种情况满足时,不应该再把为 null 子树的深度 0 参与最小值比较,例如这样
1
/
2
-
正确深度为 2,若把为 null 的右子树的深度 0 考虑进来,会得到错误结果 1
1
\
3
\
4
-
正确深度为 3,若把为 null 的左子树的深度 0 考虑进来,会得到错误结果 1
层序遍历求解
遇到的第一个叶子节点所在层就是最小深度
例如,下面的树遇到的第一个叶子节点 3 所在的层就是最小深度,其他 4,7 等叶子节点深度更深,也更晚遇到
1
/ \
2 3
/ \
4 5
/
7
代码:
public int minDepth(TreeNode root) {
if(root == null) {
return 0;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
int level = 0;
while (!queue.isEmpty()) {
level++;
int size = queue.size();
for (int i = 0; i < size; i++) {
TreeNode node = queue.poll();
//找寻叶子节点:左右孩子都是Null就是叶子节点
if (node.left == null && node.right == null) {
return level;
}
if (node.left != null) {
queue.offer(node.left);
}
if (node.right != null) {
queue.offer(node.right);
}
}
}
return level;
}
效率会高于之前后序遍历解法,因为找到第一个叶子节点后,就无需后续的层序遍历了