刷刷刷 Day 16 | 222. 完全二叉树的节点个数

文章讲述了如何解决LeetCode上的一个问题,即给定一棵完全二叉树的根节点,计算其节点数量。文中提供了两种解题思路,一种是通用的递归计算所有节点,另一种是利用完全二叉树的特性,通过计算左右子树的深度来优化计算时间复杂度。最后,文章强调了理解和利用完全二叉树特点的重要性。
摘要由CSDN通过智能技术生成
222. 完全二叉树的节点个数
LeetCode题目要求

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

示例

图
输入:root = [1,2,3,4,5,6]
输出:6
解题思路
  1. 一种方法是直接计算节点个数,不管它是什么树
  2. 根据完全二叉树的特点来计算节点个数,第一种情况是满二叉树,那么只要知道深度,就可以根据公式 2^depth - 1 计算节点个数了。 第二种情况不是满二叉树,但子树一定存在满二叉树,那么可以先找到满二叉树,计算深度,然后计算其他节点

上代码,通用节点计算

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

上代码,完全二叉树节点计算

class Solution {

    public int countNodes(TreeNode root) {
        if (root == null) {
            return 0;
        }

        TreeNode leftNode = root.left;
        TreeNode rightNode = root.right;

        // 定义左右子树深度
        int leftDepth = 0, rightDepth = 0;

        // 计算左子树深度
        while (leftNode != null) {
            leftNode = leftNode.left;
            leftDepth++;
        }

        // 计算右子树深度
        while (rightNode != null) {
            rightNode = rightNode.right;
            rightDepth++;
        }

        // 判断所有子树深度是否一致,如果一致就根据公式计算节点数量
        if (leftDepth == rightDepth) {
            return (2 << leftDepth) - 1;
        }

        // 非满二叉树,计算其他节点数量
        return countNodes(root.left) + countNodes(root.right) + 1;
    } 
}
重难点

本题使用通用解法并使用后序遍历写法很简单。但是根据题目,要分析的完全二叉树的特点,并利用它的特性计算节点数量,可以有效减少计算时间复杂度

附:学习资料链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值