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

DAY17:二叉树(六)完全二叉树的节点个数,注意深度初值和时间复杂度优化 因此,我们可以先往左递归,计算左侧深度,再一直往右递归,计算右侧深度,如果两侧深度相同,说明子树是满二叉树,直接通过。 阅读详情

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

说明:

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

示例:

输入: 
    1
   / \
  2   3
 / \  /
4  5 6

输出: 6

 

先了解一下什么是完全二叉树:

参考:https://mp.weixin.qq.com/s/UglpiGWoSjJ2Wf4weO3caQ

完全二叉树由满二叉树引出,先来了解一下什么是满二叉树:

如果二叉树中除了叶子节点,每个节点的度为2.,则此二叉树称为满二叉树。(二叉树的度代表某个节点的孩子或者说直接后继的个数。对于二叉树而言,1度是只有一个孩子或者说单子树,2度是有两个孩子或者说左右子树都有。)

比如下面这颗:

                                                 

 那什么是完全二叉树呢:

如果二叉树出去最后一层节点为满二叉树,且最后一层的节点依次从左到右分布,则此二叉树被称为完全二叉树。

比如下面这颗:

                                                            

下面这颗就不是:                                  

                                                          

递归求解:

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

 

经典解法:

        由于题中已经告诉我们这是一颗完全二叉树,我们又已知了完全二叉树除了最后一层,其他层都是满的,并且最后一层的节点全部靠向了左边。那我们可以想到,可以将该完全二叉树可以分割成若干满二叉树和完全二叉树,满二叉树直接根据层高h计算出节点为2^h-1,然后继续计算子树中完全二叉树节点。那如何分割成若干满二叉树和完全二叉树呢?对任意一个子树,遍历其左子树层高left,右子树层高right,相等左子树则是满二叉树,否则右子树是满二叉树。这里可能不容易理解,我们看图。

假如我们有树如下:

我们看到根节点的左右子树高度都为3,那么说明左子树是一颗满二叉树。因为节点已经填充到右子树了,左子树必定已经填满了。所以左子树的节点总数我们可以直接得到,是2^left - 1,加上当前这个root节点,则正好是2^3,即 8。然后只需要再对右子树进行递归统计即可。

那假如我们的树是这样:

我们看到左子树高度为3,右子树高度为2。说明此时最后一层不满,但倒数第二层已经满了,可以直接得到右子树的节点个数。同理,右子树节点+root节点,总数为2^right,即2^2。再对左子树进行递归查找。

class Solution {
    public int countNodes(TreeNode root) {
        if (root == null) {
            return 0;
        }
        int rightLevel = countLevel(root.right);
        int leftLevel = countLevel(root.left);
        if (rightLevel == leftLevel) {
            return countNodes(root.right) + (1 << leftLevel);
        } else {
            return countNodes(root.left) + (1 << rightLevel);
        }
        
    }
    private int countLevel(TreeNode root) {
        int level = 0;
        while (root != null) {
            level ++;
            root = root.left;

        }
        return level;
    }
}

二叉树的节点个数以及高度详解(附图解) 本文介绍二叉树的节点个数以及高度以及各自的递归展开图!如果我的博客对你有所帮助记得三连支持一下,感谢大家的支持! 阅读详情

相关推荐

Leetcode 222:完全二叉树的节点个数(最详细的解法!!!)

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

coordinate的博客 6235

二叉树11:完全二叉树的节点个数

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

Ge_yangwen的博客 2393

【ORB-SLAM3】使用安卓手机的摄像头运行ORB3

使用安卓手机的摄像头运行ORB-SLAM3单目

caiqidong321的博客 4995

完全二叉树的结点数

完全二叉树有一个关于结点数的性质: 结点从1开始编号,层序。那么分每一个结点(编号为i)的左孩子结点是2i,右孩子结点编号是2i+1. 反之,根据孩子结点的编号可以推知父结点的编号:孩子结点编号的一半取整。下面是一个应用的例子: 一棵完全二叉树有1001个结点。其中叶结点的个数是几个? 分析: 1001个结点,则最后一个结点的编号是1001,那么它的父亲结点编号是500,注意,这个并不一

m0_37701448的博客 5541

跟着团子学SAP:SAP用户状态管理详解(含权限分配等) OK02

SAP用户状态详细配置逻辑及解析

Lucas1211的博客 3万+

FC游戏金手指代码大全:亲测可用指南与内存修改原理

在计算机和游戏开发领域,内存修改是一项基础而强大的技术,它通过直接读写程序运行时内存中的数据,改变软件的行为和状态。其核心原理在于理解进程的内存地址空间布局,定位存储关键游戏变量(如生命值、金币数)的特定地址,并注入或锁定目标数值。这项技术的工程价值在于,它不仅能用于游戏辅助,更是软件逆向工程、漏洞分析和调试的重要实践手段。在怀旧游戏和模拟器场景中,内存修改以“金手指”或“作弊码”的形式广泛应用,帮助玩家自定义游戏体验。本文将聚焦FC(红白机)游戏,深入解析Game Genie码和Raw码两种主流金手指格式

weixin_30780649的博客 791

leetcode222 完全二叉树的节点个数

在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。对于情况二,分别递归左孩子,和右孩子,递归到某一深度一定会有左孩子或者右孩子为满二叉树,然后依然可以按照情况1来计算。可以看出如果整个树不是满二叉树,就递归其左右孩子,直到遇到满二叉树为止,用公式计算这个子树(满二叉树)的节点数量。

dokii1的博客 504

国内9大Coding Plan平台实测:CI/CD延迟与开发者体验横评

代码托管平台不仅是Git仓库,更是现代研发流程的‘生产力基建’核心。其底层能力涵盖Git协议优化、CI/CD调度实时性、制品库并发吞吐及RBAC权限收敛效率等关键维度。尤其在团队规模扩张、日均提交激增、多环境高频部署场景下,Webhook延迟、CI排队耗时、制品上传卡顿等应用层性能指标,远比网络层ping值更能决定开发效能。本文基于真实微服务项目(32模块、8.7万行/仓)与三类极端负载(长尾构建、热区冲突、制品洪峰),对国内9个满足Coding Plan标准的平台开展端到端压测,聚焦CI/CD延迟与开发者

weixin_29281941的博客 367

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

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

2301_80211119的博客 726

NY8A053E 例程 之 PWM Ouput

更多关于NY8A053E的相关例程请留言!

倪彬笑阳的博客 2925

红外图像处理实战:用MATLAB实现时域高通滤波(THPF)去噪(附完整代码)

本文详细介绍了如何利用MATLAB实现时域高通滤波(THPF)算法进行红外图像去噪,包括核心原理、工程实现要点和完整代码示例。通过分析时间窗口选择、空域预处理优化和自适应参数调整等关键点,帮助开发者有效抑制固定图案噪声,适用于无人机载红外监测和安防监控等场景。

weixin_42783709的博客 183

LeetCode第222题_完全二叉树的节点个数

LeetCode 第222题要求计算完全二叉树的节点个数。完全二叉树的特性是除了最底层,其他层节点数达到最大值,且最底层节点集中在左侧。题目提供了三种解法: 递归遍历:适用于任何二叉树,时间复杂度为O(n),空间复杂度为O(log n)。 二分查找 + 位运算:利用完全二叉树的特性,通过比较左右子树高度,递归计算节点数,时间复杂度为O(log² n),空间复杂度为O(log n)。 二分搜索最后一层:通过二分搜索确定最后一层节点数,时间复杂度为O(log² n),空间复杂度为O(1)。 代码实现包括C#和

qq_40263592的博客 1071

60、拓扑码:从理论到应用

本博客深入探讨了拓扑码的基本理论、构造方法及其在量子计算中的应用。重点介绍了颜色码的拓扑起源、编码量子比特的计算方法、弦算子的构造与性质、边界条件的影响、同调描述以及与统计模型相关的错误阈值分析。同时,还涵盖了拓扑码的历史发展、与其他拓扑码的关系、与凝聚态系统的联系,以及其在激发态和高维中的表现。博客展示了拓扑码在容错量子计算和未来量子信息领域的广阔前景。

o1p2q3r的博客 129

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

题目来源 222. 完全二叉树的节点个数 题目描述 题目解析 /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { public int countNodes(TreeNode

OceanStar的博客 311

解决:请求的资源[/xxx/]不可用 描述 源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示。

解决:请求的资源[/xxx/]不可用 描述 源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示。

念兮为美 1万+

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

算法:LeetCode222_完全二叉树的节点个数

【代码】算法:LeetCode222_完全二叉树的节点个数。

工匠精神coding,终生学习 438

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

leetcode222.完全二叉树节点个数

但这没有利用完全二叉树的性质,这里要区分满二叉树和完全二叉树(自己查定义)。从根节点往左走,得到最左深度maxDepthL,同理从根节点往右走,得到最右深度maxDepthR,如果maxDepthL == maxDepthR,那么就是一课满二叉树,直接计算返回,不然继续向下递归,总能得到满二叉树,这样可以不用遍历所有节点。首先最直观的想法,对于一个普通二叉树,我们想知道节点个数,递归得到:左子树节点数目 + 右子树节点数目 + 1(当前节点),返回给上层函数(告诉他爹,我这有这么多节点~)

Ymmmm__的博客 217

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

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

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

ylumwd的博客 1104

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

完全二叉树的性质是:我简单说一下,大概就是其他节点都满了,就是只缺右面的叶子节点,右面叶子节点缺多少都行,只要不是左面少节点就行。这个节点个数可以使用递归左儿子个数+递归右儿子个数+1,这个1是根节点,最后结果为节点个数,但我们没有练习到完全二叉树的性质.知道了这个性质,就直到完全二叉树是由满二叉树组成的,那么我们直接求满二叉树的节点就行,满二叉树的节点数量为depth*2-1。

月亮被咬碎成星星的博客 391

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

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

m0_68880377的博客 1018

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

LeetCode 222. 完全二叉树的节点个数 给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。 完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2^h 个节点。 题解: 方法一:可以通过遍历的方式求解,时间复杂度为O(n) 方法二: 由完全二叉树的性质可以得知,最后一层的最左侧节点一定不为空,因此可以设置指针node一直往左走,来计算完全二叉树的层数

llzqxl的博客 169

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

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

Love Peace 166

【LeetCode222】完全二叉树的节点个数

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

Pyroyster的博客 256

二叉树:LC222,完全二叉树的节点个数

【代码】二叉树:LC222,完全二叉树的节点个数。

weixin_51243388的博客 219
上一篇: mybatis排序
下一篇: Java connection集合
给自己加加油
博客等级 码龄8年 302粉丝 110原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值