代码随想录刷题Day16 | 104.二叉树的最大深度 | 111.二叉树的最小深度 | 222.完全二叉树的节点个数

代码随想录刷题Day16 | 104.二叉树的最大深度 | 111.二叉树的最小深度 | 222.完全二叉树的节点个数

104.二叉树的最大深度

题目:

给定一个二叉树,找出其最大深度。

二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

说明: 叶子节点是指没有子节点的节点。

思路:

先愤青二叉树的高度和深度:

  • 二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数或者节点数(取决于深度从0开始还是从1开始)
  • 二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数后者节点数(取决于高度从0开始还是从1开始)

我们采用后序遍历的方式来做,如果当前节点为空节点,返回深度0,不然深度为左右子树的深度的最大值+1

代码:

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

111.二叉树的最小深度

题目:

给定一个二叉树,找出其最小深度。

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

*说明:*叶子节点是指没有子节点的节点。

思路:

这道题和上道题类似,也是采用后序遍历的方法。

如果我们只把上题的max修改为min,发现会报错,针对例子root = [2,null,3,null,4,null,5,null,6]而言(如下图),直接修改max为min结果应该为1才对,此时的1时头节点到其左孩子节点的深度,但是其左孩子是一个空节点,不是一个叶子节点。我们只需要对只有一个孩子节点的节点处理一下,返回其左右子树深度的最大值+1即可(抛弃空姐点的深度)

image-20221027151559421

代码:

class Solution {
    public int minDepth(TreeNode root) {
        if(root == null) return 0;
        //if(root.left == null && root.right == null) return 1;
        if(root.left == null || root.right == null) return 1 + Math.max(minDepth(root.left), minDepth(root.right));
        return 1 + Math.min(minDepth(root.left), minDepth(root.right));
    }
}

222.完全二叉树的节点个数

题目:

给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。

完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。

思路:

  1. 按照普通二叉树的思路,递归每一个节点,统计个数
  2. 利用完全二叉树的性质。如果递归向左遍历的深度等于递归向右遍历的深度,是满二叉树,直接返回2^deep - 1,如果相等,则不是满二叉树,递归左右子树。

代码:

  1. 普通二叉树
class Solution {
    public int countNodes(TreeNode root) {
        if(root == null) return 0;
        return 1 + countNodes(root.left) + countNodes(root.right);
    }
}
  1. 完全二叉树
class Solution {
    public int countNodes(TreeNode root) {
        if(root == null) return 0;
        TreeNode left = root.left, right = root.right;
        int leftDeep = 0, rightDeep = 0;
        while(left != null){
            left = left.left;
            leftDeep++;
        }
        while(right != null){
            right = right.right;
            rightDeep++;
        }
        if(leftDeep == rightDeep){
            return (2 << leftDeep) - 1;
        }
        return 1 + countNodes(root.left) + countNodes(root.right);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值