java数据结构与算法刷题-----LeetCode222. 完全二叉树的节点个数

【GIS效率手册】告别C盘爆满:三步重置ArcMap默认地理数据库路径 本文针对ArcMap用户C盘空间常被占满的问题,提供了三步重置默认地理数据库路径的详细教程。通过修改地图文档属性,将数据存储位置从C盘迁移至其他驱动器,不仅能有效释放系统盘空间,还能提升数据管理效率与安全性,是GIS数据规范化管理的关键一步。 阅读详情
java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.youkuaiyun.com/grd_java/article/details/123063846

在这里插入图片描述

1. 法一:利用完全二叉树性质,进行递归二分查找

解题思路:时间复杂度O( l o g 2 n log_2{n} log2​n),空间复杂度O(n),因为递归底层需要栈来实现
  1. 完全二叉树:除去最后一层,剩下的是满二叉树。其中满二叉树也是完全二叉树的一种。
  1. 完全二叉树最后一层的叶子结点,必须是连续的
  2. 最后一层如果不满,假设最后一层只有一个叶子结点,也一定是左结点。因为它必须连续。所以,缺也不会缺左结点
  1. 满二叉树的结点个数为: 2 高度 − 1 2^{高度}-1 2高度−1,例如一个满二叉树高的为5,那么一共有 2 5 − 1 = 31 2^5-1 = 31 25−1=31个结点
  2. 所以,我们依次从根节点开始遍历
  1. 如果当前结点代表着一棵满二叉树(完全二叉树前提下,左子树高的 = 右子树高度),那么代表左子树一定是满的。而右子树未必是满的,因为只是高度一样,完全二叉树只能保证,缺也不会缺左结点。而现在有右节点,说明左节点不缺
  2. 因此左子树高的 = 右子树高度,可以直接跳过左子树,用公式 2 左子树高度 − 1 2^{左子树高度}-1 2左子树高度−1计算左子树的结点个数,然后算上当前根节点+1,最终为 2 左子树高度 2^{左子树高度} 2左子树高度个结点
  3. 但是如果左子树高的 != 右子树高度,说明最后一层不满,但是除去最后一层,其余的一定为满二叉树,所以右子树一定是满二叉树,只不过比左子树高的少1而已
  4. 因此左子树高的 != 右子树高度时:右子树的结点个数+当前结点 = 2 右子树高度 2^{右子树高度} 2右子树高度
代码

在这里插入图片描述

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */

class Solution {
    /**
        left == right。表示左右子树深度相同,又因为是完全二叉树,因为节点已经填充到右子树了
        所以左子树一定是满二叉树,所以左子树的节点总数是 2^left - 1,加上当前这个 root 节点,则正好是 2^left(2的left次方)。
        然后只需要再对右子树进行递归统计即可。
        left != right。表示左右子树深度并不一致,因为是完全二叉树,必然是左深右浅
        而且最后一层是不满的,倒数第二层必然是满的,而左深右浅,说明右子树是满二叉树,它的深度比左子树少1。为2^right
        那么也同样进行,右子树节点 + root 节点,总数为 2^right。再对左子树进行递归查找。
        
        其中2的多少多少次方,可以写为 1 << 多少多少。例如 1 << left等价于2^left(2的left次方)
     */
    public int countNodes(TreeNode root) {
        if(root == null) return 0;//如果是空树直接返回0
        int left = countLevel(root.left);//获取左子树的深度
        int right = countLevel(root.right);//获取右子树的深度
        //如果左子树深度和右子树一致,就说明root的子树是满二叉树
        if(left == right)//如果是满二叉树,它的最后一个叶子结点一定在最右边侧
            return countNodes(root.right) + (1 << left);//所以疯狂递归统计右边结点,另外不要忘记加上左子树的结点
        else//如果不是满二叉树,那么对完全二叉树来说,它的最后一个叶子结点一定在左侧
            return countNodes(root.left) + (1 << right);//所以疯狂遍历左边,另外不要忘记加上右子树结点
    }
    //统计root结点的深度
    private int countLevel(TreeNode root){
        int level = 0;
        //只统计左子树,因为是完全二叉树的原因,无论是否为满二叉树,哪怕是它的最后一层只有一个叶子结点
        //也一定落在左侧。
        while(root != null){
            level++;
            root = root.left;//每向下走一次,level + 1 一下
        }
        return level;
    }
}

2. 二分查找+位运算

解题思路:时间复杂度O( l o g 2 n log_2{n} log2​n),空间复杂度O(1)
  1. 先统计深度
  2. 那么倒数第二层必然是满二叉树。
  3. 最后一层不确定有多少个
  4. 我们对其进行二分查找。看看最后一个叶子结点,在最后一层哪个位置
  5. 最后将倒数第二层的满二叉树+最后一层的结点个数 = 整个数的结点个数
代码

在这里插入图片描述

class Solution {
    public int countNodes(TreeNode root) {
        if (root == null) {//如果root为null直接返回
            return 0;
        }
        int level = 0;//保存高度(深度)
        TreeNode node = root;//获取当前结点
        while (node.left != null) {//如果左节点存在
            level++;//统计深度
            node = node.left;
        }
        //low表示左后一层最左边的结点。
        //因为我们从0开始统计的level,所以1 << level -1(2^level-1)正好是倒数第二层的满二叉树结点
        //high 表示 如果是满二叉树,它为最后一个结点
        //我们在这个范围进行二分查找
        int low = 1 << level, high = (1 << (level + 1)) - 1;
        while (low < high) {
            int mid = (high - low + 1) / 2 + low;//获取中间结点的位置
            if (exists(root, level, mid)) {
                low = mid;
            } else {
                high = mid - 1;
            }
        }
        return low;
    }

    public boolean exists(TreeNode root, int level, int k) {
        int bits = 1 << (level - 1);//bits指向倒数第二层
        TreeNode node = root;
        while (node != null && bits > 0) {
            if ((bits & k) == 0) {
                node = node.left;
            } else {
                node = node.right;
            }
            bits >>= 1;
        }
        return node != null;
    }
}

【PLL】分频器设计权衡:从CMOS到CML的电路实现与优化 本文深入探讨了PLL中分频器的设计权衡,比较了CMOS和CML两种电路实现的优缺点。通过实际案例分析,展示了如何在速度、功耗和噪声之间取得平衡,特别是在5G射频芯片和Wi-Fi 6E等高频应用中的优化实践。文章还提供了混合架构设计和电源噪声协同优化的实用技巧,适合电路设计工程师参考。 阅读详情

相关推荐

【无标题】EXCEL实现刷题

运用Excel开发的刷题工具,具有普遍实用性,可将WORD的试题自动导入并实现刷题。

weixin_44081794的博客 2975

【简单】力扣算法题解析LeetCode222:完全二叉树的节点个数

题目要求计算完全二叉树的节点个数。利用完全二叉树的性质,若左右子树高度相等则为满二叉树,直接通过公式 2^h - 1 计算节点数;否则递归求解左右子树。时间复杂度优化至 O((log n)^2)。Java代码通过高度比较和递归实现高效计算。

ylumwd的博客 1104

手把手教你用AppsFlyer SDK实现延迟深度链接(附Android/iOS代码示例)

本文详细介绍了如何使用AppsFlyer SDK实现延迟深度链接,提供Android和iOS双平台代码示例,帮助开发者解决跨平台精准跳转与用户归因问题。通过实战案例和高级场景分析,提升应用的用户转化率和广告投放效果。

sre5engineer的博客 704

Java实现 LeetCode 222 完全二叉树的节点个数

222. 完全二叉树的节点个数 给出一个完全二叉树,求出该树的节点个数。 说明: 完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。 示例: 输入: 1 / \ 2 3 / \ / 4 5 6 输出: 6 /** * D...

南 墙 1万+

在WinXP操作系统上安装Tornado2.2详细教程

使用VxWorks的人都想在自己的电脑中装VxWorks的编译器Tornado,然而Win10操作系统对于Tornado并不友好,根本装不成功。而对于Win7操作系统,之前在实验室一台Win7上装Tornado成功过,并且一直在上面进行vx开发,但是过一段时间在其他Win7上装Tornado时又不能成功,由此说明Tornado对于Win7操作系统对Tornado的兼容也不是很好,所以想要长久使用T...

weixin_43822311的博客 4482

ios生成海报使用dom-to-image中toPng报错isTrusted:true

主要是ios中safari浏览器解析错误,引起的报错,主要引起原因toPng会调用toSvg,toSvg直接将html标签内容通过svg中foreignObject标签直接包裹,然后转base64, 通过data:image/svg+xml;解决办法:二次生成(调用两次),判断ios or 安卓,生成第一次生成,不用参数,例如:scale: 3,在第二次生成再进行清晰度操作,避免多次生成,引起性能消耗。以上种种很多案例,使用canvase进行转换的,标签丢失,直接toPng版本的,兼容性问题。

weixin_44601570的博客 2106

222.完全二叉树的节点个数(二叉树算法)

摘要: 题目要求计算完全二叉树的节点个数。给出三种解法:1)递归法(后序遍历),时间复杂度O(n),空间复杂度O(logn);2)精简递归(一行代码);3)迭代法(层序遍历/BFS),利用队列统计节点数,时间O(n),空间O(n)。递归法通过左右子树递归累加节点数,迭代法逐层遍历计数。两种方法均适用于任意二叉树,但题目保证输入为完全二叉树。代码示例包含详细注释,帮助理解递归终止条件与单层逻辑。

m0_68880377的博客 1018

30分钟搭建AI科研写作工作台:基于WorkBuddy的论文全流程加速实践

在人工智能技术日益普及的今天,如何利用智能工具提升专业领域工作效率成为关键课题。其核心原理在于通过模块化设计,将复杂的任务流程拆解为可复用、可编排的标准化技能单元,并结合精准的指令控制,实现从通用对话到深度任务执行的转变。这一技术价值在于显著降低重复性劳动强度,将人的创造力聚焦于核心决策与创新环节。在科研写作、数据分析、代码开发等场景中,这类智能工作台能有效辅助完成文献调研、内容生成、格式校验等繁琐步骤。本文以科研论文写作为具体应用场景,深入探讨如何利用WorkBuddy这一智能工作台,通过配置核心科研技能

weixin_29032489的博客 1547

【算法leetcode】222. 完全二叉树的节点个数(rust和go)

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

二当家的白帽子 571

【全开源】旅行吧旅游门票预订系统源码(FastAdmin+ThinkPHP+Uniapp)

此外,系统还会根据我的旅行计划和喜好,为我推荐合适的景点和门票,让我的旅行更加丰富多彩。旅游门票预订系统的出现,不仅简化了门票预订的流程,还提高了旅行的便捷性和效率。一款基于FastAdmin+ThinkPHP+Uniapp开发的旅游门票预订系统,支持景点门票、导游产品便捷预订、美食打卡、景点分享、旅游笔记分享等综合系统,提供前后台无加密源码,支持私有化部署。如今,有了旅游门票预订系统,这些问题都能迎刃而解。智能推荐:系统还会根据你的旅行计划和喜好,为你推荐合适的景点和门票,让你的旅行更加丰富多彩。

2401_84413757的博客 1302

《电磁兼容设计》专栏说明

本专栏自2024年1月起开始更新,仅设此一个电磁兼容相关知识专栏,并将一直持续更新下去,无期限

linkking27的博客 794

力扣222. 完全二叉树的节点个数(Java实现)

计算公式:**树的总高度h - c的层数 - 1 ** = 4 - 3 -1 = 0,即c的右子树节点数 = 2。= 4,说明c的右子树是满二叉树。b的右子树的最左节点层数 = 4,说明 b 的左子树是满二叉树。a的右子树的最左节点层数= 3 < 4,说明右子树是满二叉树。左子树节点数 + b节点数 = 3 + 1 = 4 = 2。右子树节点数 + a节点数 = 3 + 1 = 4 = 2。= 4 - 1 - 1 = 2 ,即右子树的节点数 = 2。= 4 - 2 = 2,即b的左子树节点数 = 2。

Wood_Like的博客 664

Autosar NvM配置-手动配置Nvblock及使用-基于ETAS软件

NVM作为存储协议栈中最顶层的模块,是必须要掌握的。目前项目基本使用MCU带的Dflash模块,使用Fee模拟eeprom。在项目前期阶段,应该充分讨论需要存储的内容,包括应用数据,诊断数据等,用以评估Dflash空间是否够用。本文基于ETAS软件介绍NVBlock配置生成NVM参数及使用。使用NVBlock配置生成,基本不用手写代码,还是比较方便的。对于Nv block的划分,建议将同时写的一类数据放到一个block中,因为block除了data以外,Fee还会增加一些header数据,占用不少内存。

赞的博客 1886

LeetCode题练习与总结:完全二叉树的节点个数--222

本文详细介绍了如何计算完全二叉树的节点个数,包括解题思路、具体代码实现、时间复杂度和空间复杂度分析,以及涉及的知识点,为解决此类问题提供了清晰的指导。

一直学习永不止步 924

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

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

本文介绍了计算完全二叉树节点数的两种方法: 递归法:适用于所有二叉树,直接递归计算左右子树节点数之和加1,简单但未利用完全二叉树特性。 优化方法:利用完全二叉树特性,通过比较左右子树高度来分情况计算: 若左右高度相等,则左子树为满二叉树,可直接计算其节点数(2^高度-1),再递归计算右子树 若高度不等,则右子树为满二叉树,直接计算其节点数,再递归计算左子树 使用位运算(1<<高度)快速计算2的幂次 该方法时间复杂度为O(logN * logN),比普通递归法的O(N)更高效。

TsubakiPDF的博客 612

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【经典算法】LeetCode 222. 完全二叉树的节点个数(Java/C/Python3实现含注释说明,Easy)

方式优点缺点时间复杂度空间复杂度方式一(层次遍历)直观易懂,不依赖特殊性质代码量较大,需要额外的空间存储队列O(N)O(N)(队列空间)方式二(二分查找+递归)利用完全二叉树的性质,平均性能较好递归调用栈可能较深,最坏情况下时间复杂度较高O(N log N)O(H)(H为树的高度,通常小于N)

1566

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

刷题计划 day15 二叉树(四)【完全二叉树的节点个数】【平衡二叉树】【二叉树的所有路径】

刷题计划 day15 二叉树(四)【完全二叉树的节点个数】【平衡二叉树】【二叉树的所有路径】

weixin_72499901的博客 674

leetcode刷题记录(四十五)——222. 完全二叉树的节点个数

- 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。给你一棵的根节点root,求出该树的节点个数。的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第h层,则该层包含1~ 2^h个节点。6root = []0root = [1]1遍历树来统计节点是一种时间复杂度为O(n)的简单解决方案。

weixin_45994787的博客 592

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

完全二叉树的节点个数题目链接描述示例初始代码模板代码 题目链接 https://leetcode-cn.com/problems/count-complete-tree-nodes/ 描述 给出一个完全二叉树,求出该树的节点个数。 说明: 完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。 示例 输入: 1 / \ 2 3 / \

博主是个二次元死肥宅~ 339

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

题目 解答 解法一:全部遍历 代码 /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class S...

LetJava的博客 1037

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

给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2的h次方 个节点。提示:树中节点的数目范围是[0, 5 * 10的4次方]0

luoyepiaoxue2014的博客 272

二叉树习题其二Java【力扣】【算法学习day.9】

前言书接上篇文章二叉树习题其一,这篇文章我们将基础拓展###我做这类文档一个重要的目的还是给正在学习的大家提供方向(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非常非常高滴!!!

2301_79232523的博客 1740

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

题目描述:给出一个完全二叉树,求出该树的节点个数。说明:完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。示例:输入: 1 / \ 2 3 / \ / 4 5 6 输出: 6思路:这个解题方法是来自于leetCode上一...

sinat_15723179的博客 1327

leetcode-222:完全二叉树的节点个数

leetcode-222:完全二叉树的节点个数题目解题 题目 题目链接 给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。 完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。 示例 1: 输入:root = [1,2,3,4,5,6] 输出:6 示例 2: 输入:root = [] 输出:0 示例 3: 输入:root = [1] 输出:

菊头蝙蝠的博客 365

LeetCode刷题——完全二叉树的节点个数#222#Medium

完全二叉树的节点个数的思路探讨与源码     完全二叉树的节点个数的题目如下图,该题属于搜索类和树类型的题目,主要考察对于搜索方法的使用和树结构的理解。本文的题目作者想到2种方法,分别是二分搜索方法和DFS深度优先搜索方法,其中二分搜索方法使用Java进行编写,而DFS深度优先搜索方法使用Python进行编写,当然这可能不是最优的解法,还希望各位大佬给出更快的算法。     本人认为该题目可以使用二分搜索方法的思路进行解决,首

喷火龙与水箭龟的博客 1787
上一篇: java数据结构与算法刷题-----LeetCode144. 二叉树的前序遍历
下一篇: java数据结构与算法刷题-----LeetCode102. 二叉树的层序遍历
ydenergy_殷志鹏
博客等级 码龄7年 5887粉丝 543原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ydenergy_殷志鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值