题目:
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明:叶子节点是指没有子节点的节点。注意最小深度的定义。
思路一:递归法。该题与求二叉树的最大深度还是有些不同的,需要增加一些判断,要注意左右子树不同时为空时并不是最低点,左右子树同时为空时才是最低点。
代码:
public int minDepth(TreeNode root) {
return getMinDepth(root);
}
public int getMinDepth(TreeNode node){
if(node==null)
return 0;
int leftDepth=getMinDepth(node.left);
int rightDepth=getMinDepth(node.right);
if(node.left==null&&node.right!=null)//左子树为空右子树不为空,此时不是最低点
return 1+rightDepth;
if(node.left!=null&&node.right==null)//左子树不为空右子树为空,此时不是最低点
return 1+leftDepth;
//左右子树不同时为空
int depth=1+Math.min(leftDepth,rightDepth);
return depth;
}
思路二: 迭代法。使用层序遍历。
代码:
public int minDepth(TreeNode root) {
if(root==null)
return 0;
Queue<TreeNode> queue=new LinkedList<>();
queue.offer(root);
int depth=0;
while(!queue.isEmpty()){
int len=queue.size();
depth++;
while(len>0){
TreeNode node=queue.peek();
if(node.left==null&&node.right==null)//叶子节点,也是最低点
return depth;
if(node.left!=null)
queue.offer(node.left);
if(node.right!=null)
queue.offer(node.right);
queue.poll();
len--;
}
}
return depth;
}