【5.04 代随_16day】 二叉树的最大深度、二叉树的最小深度、完全二叉树的节点个数

文章介绍了如何计算二叉树的最大深度和最小深度,分别提供了递归和迭代两种方法,并详细解释了代码实现。同时,文章讲解了如何利用完全二叉树的特性来计算节点个数,同样涉及递归策略。
摘要由CSDN通过智能技术生成


二叉树的最大深度

力扣连接:104. 二叉树的最大深度(简单)

1.递归的方法

递归的图解步骤

暂无

递归代码

class Solution {
    int max = 0;
    public int maxDepth(TreeNode root) {
        if(root==null) return 0;
        max = Math.max(maxDepth(root.left),maxDepth(root.right))+1;

        return max;
    }
}

2.迭代的方法

使用队列的方法

迭代的图解步骤

在这里插入图片描述

代码

class Solution {
    public int maxDepth(TreeNode root) {
        int result = 0;
        if(null==root) return result;
        Queue<TreeNode> que = new LinkedList<>();
        que.add(root);

        while(!que.isEmpty()){
            int size = que.size();
            while(size>0){
                TreeNode tmp = que.poll();

                if(null!=tmp.left) que.add(tmp.left);
                if(null!=tmp.right) que.add(tmp.right);
                
                size--;
            }
            result++;
        }

        return result;
    }
}


二叉树的最小深度

力扣连接:111. 二叉树的最小深度(简单)

1.递归的方法

递归的图解步骤

在这里插入图片描述

递归代码

class Solution {
    /**
     * 递归法,相比求MaxDepth要复杂点
     * 因为最小深度是从根节点到最近**叶子节点**的最短路径上的节点数量
     */
    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;
        }
        // 左右结点都不为null
        return Math.min(leftDepth, rightDepth) + 1;
    }
}

2.迭代的方法

关键点

  • 由于是从上往下遍历,遇到第一个左右==null的叶子结点即最小值

代码

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()) {
            int size = deque.size();
            depth++;
            for (int i = 0; i < size; i++) {
                TreeNode poll = deque.poll();
                if (poll.left == null && poll.right == null) {
                    // 是叶子结点,直接返回depth,因为从上往下遍历,所以该值就是最小值
                    return depth;
                }
                if (poll.left != null) {
                    deque.offer(poll.left);
                }
                if (poll.right != null) {
                    deque.offer(poll.right);
                }
            }
        }
        return depth;
    }
}


完全二叉树的节点个数

力扣连接:222.完全二叉树的节点个数(中等)

1.完全二叉树 特性的方法

图解步骤

判断其子树是不是满二叉树,不是就递归其左右孩子,直到遇到满二叉树为止,用公式计算这个子树(满二叉树)的节点数量。
在这里插入图片描述

代码

class Solution {
    //第一步,确定递归函数的参数和返回值
    public int countNodes(TreeNode root) {
        //第二步,终止条件的写法
        if(root==null) return 0;

        TreeNode leftNode = root.left;
        TreeNode rightNode = root.right;
        int leftCount = 0,rightCount = 0;
        while(leftNode!=null){
            leftNode = leftNode.left;
            leftCount++;
        }

        while(rightNode!=null){
            rightNode = rightNode.right;
            rightCount++;
        }

        if(leftCount==rightCount){
            return (2<<leftCount)-1;
        }

        //第三步,单层递归的逻辑
        int left = countNodes(root.left); //左
        int right = countNodes(root.right);//右
        int total = left + right + 1;//中

        return total;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值