题目描述:
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明: 叶子节点是指没有子节点的节点。
解题步骤:
解法一:按照最初的想法,还是可以用宽搜BFS的方法来解决。
(1)创建一个队列用来保存每一层的节点
(2)如果遍历到当前节点的左右子节点都为空,返回当前的层数,就是二叉树的最小深度
代码:
public int minDepth(TreeNode root) {
int level = 0;
if(root==null)
return 0;
Queue<TreeNode> que = new LinkedList<>();
que.add(root);
boolean flag = false;
while(!que.isEmpty()) {
level++;
int len = que.size();
for (int i = 0; i < len; i++) {
TreeNode temp = que.poll();
if(temp.right!=null)
que.add(temp.right);
if(temp.left!=null)
que.add(temp.left);
if(temp.right==null && temp.left==null){
flag = true;
break;
}
}
if(flag)
break;
}
return level;
}
解法二:采用递归的思想更加简单
注意:如果根节点的左或右子树为空的话是构不成子树的。而最小深度是要求从根节点到子树的。当左或右子树为空时,不符合要求。
比如如下所示二叉树:
根节点的左子树为空,那么就不能构成最小深度,我们还需要去遍历右子树。所以该二叉树的最小深度为2而不是1。
对于二叉树的最大深度的求解,就可以不必判断根节点的左右子树是否为空。
public int minDepth(TreeNode root) {
if(root==null)
return 0;
// 左节点节点为空
if (root.left == null && root.right != null) {
return 1 + minDepth(root.right);
}
// 右节点为空
if (root.right == null && root.left != null) {
return 1 + minDepth(root.left);
}
return Math.min(minDepth(root.left), minDepth(root.right))+1;
}