力扣 111. 二叉树的最小深度

力扣 111. 二叉树的最小深度

题目 二叉树最小深度
这道题跟二叉树的最大深度非常相似,但是在使用递归或迭代方法处理时需要注意:对于左右子树都为空的结点,从根节点到该节点的深度才是最小深度;如果某个结点有左子树却没有右子树或者没有左子树却有右子树,这样的结点就需要继续往下遍历,直到遇到一个结点的左右子树都为空才停止。
我在做这个题的时候,直接把求二叉树最大深度的代码里的返回值调换了一下,这样做当然是错的,因为如果有一个结点有一个左子树(或者右子树),另一个子树是空的,就会直接在当前节点处停止遍历,结果就会出错。

// 求二叉树最大深度
class Solution {
    public int maxDepth(TreeNode root) {
        if(root==null)return 0;
        int leftDep=maxDepth(root.left);
        int rightDep=maxDepth(root.right);
        if(leftDep>rightDep)return leftDep+1;
        else return rightDep+1;
    }
}

而正确的解法是把这种情况:“左子树(或右子树)存在,另一个子树为空”单独考虑,最终在左右子树都为空的节点处停止。

// 求二叉树的最小深度
class Solution {
    public int minDepth(TreeNode root) {
        if(root==null)return 0;
        Queue<TreeNode> queue=new LinkedList<>();
        int height=0, num=0;
        TreeNode node=null;
        queue.add(root);
        while(!queue.isEmpty()){
            num=queue.size();
            height++;
            for(int i=0; i<num; i++){
                node=queue.remove();
                if(node.left!=null && node.right!=null){
                    queue.add(node.left);
                    queue.add(node.right);
                }
                else if(node.left!=null )queue.add(node.left);
                else if(node.right!=null)queue.add(node.right);
                else return height;
            }
        }
        return height;
    }
}

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注