首页 > 其他分享 >代码随想录——二叉树-11.完全二叉树的节点个数

代码随想录——二叉树-11.完全二叉树的节点个数

时间:2024-11-11 11:57:17浏览次数:1  
标签:11 right TreeNode int nullptr 随想录 二叉树 left

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

思路

一、层序遍历,时间复杂度O(n)

二、利用完全二叉树性质,时间复杂度O(logn * logn)(小于O(n))

完全二叉树性质:若树深度为h,则前h-1层节点都达到最大值。第h层节点都集中在最左侧的位置
完全二叉树要么1.是满二叉树 2.最后一层没满

  1. 满二叉树计算节点数太方便了,直接用公式2^h-1。

  2. 最后一层没满则遍历根的左右子树,递归到某一深度一定会有左孩子或者右孩子为满二叉树,然后依然可以按照情况1来计算

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

那么现在的问题就是怎么判断一棵树是否是满二叉树:在完全二叉树中,若左右子树的深度一样则为满二叉树

代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int countNodes(TreeNode* root) {
        //1.终止条件
        if(root == nullptr)return 0;
        //2.中间代码
        int lheight=0,rheight=0;
        TreeNode* lnode = root->left,*rnode = root->right;
        while(lnode != nullptr){ //左子树深度
            lheight++;
            lnode = lnode->left;
        }
        while(rnode != nullptr){ //右子树深度
            rheight++;
            rnode = rnode->right;
        }
        if(lheight == rheight){
            return (2 << lheight) - 1; //用位运算代替幂,速度更快
        }
        return countNodes(root->left) + countNodes(root->right) + 1;
    }
};

总结

本题难点在于怎么利用完全二叉树性质,对于满二叉树用公式计算节点很容易想到,但想到非满二叉树可以递归直到找到有左右子树是满二叉树则不容易。而利用完全二叉树性质判断满二叉树也是第一次见。

此外还要分析清楚递归的三大条件(递归函数,终止条件和单层递归逻辑),树的遍历顺序(左右中,后序遍历)

标签:11,right,TreeNode,int,nullptr,随想录,二叉树,left
From: https://www.cnblogs.com/neromegumi/p/18539420

相关文章

  • 题解:P11250 [GESP202409 八级] 手套配对
    题目传送门思路讲解一道非常经典的排列组合的题。首先,我们要先从nnn对手套中取走kk......
  • 【多线程】---1115. 交替打印 FooBar
     解法1:condition_variable + mutex classFooBar{private:intn;mutexmtx;condition_variablecv;boolfoo_done=false;public:FooBar(intn){this->n=n;}voidfoo(function<void()>printFoo)......
  • 上周热点回顾(11.4-11.10)
    热点随笔:· 【故障公告】k8s集群2台32核64G节点服务器被释放造成全站故障 (博客园团队)· 强!34.1Kstar!再见Postman,新一代API测试利器,功能强大、颜值爆表! (狂师)· .NET开发者福音:JetBrains官方宣布Rider非商用免费开放! (追逐时光者)· 又给会员送福利,100台一年华为云......
  • 代码随想录之滑动窗口、Java日期api、集合(11.4-11.11)
    代码1、长度最小的子数组⭐使用滑动窗口的思想,外层循环控制结束位置j,内层循环控制起始位置i,看似是双层循环,但时间复杂度是o(2n)。 2、水果成篮自己想法:使用backet1和backet2表示篮子1和篮子2;使用backet1Account和backet2Account分别表示两个篮子里水果的数量,内层循环将i指针......
  • 【开发心得】筑梦上海:项目风云录(11)
    没想到这个长篇能够写这么多篇,根据之前的反馈,今后在每次开始后面的故事之前,先分享一段之前文章中提到的原型界面和代码,算是给之前的技术文章填坑吧。代码揭秘这个就是最原型的一个界面,整个系统中的form全部是引用这个form。这个设计现在已经不稀奇了,但在当时,有了这个form以后......
  • KubeSphere 社区双周报| 2024.10.25-11.07
    KubeSphere社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过commit的贡献者,并对近期重要的PR进行解析,同时还包含了线上/线下活动和布道推广等一系列社区动态。本次双周报涵盖时间为:2024.10.25-11.07。贡献者名单新晋KubeSpherecontribu......
  • 2024年项目管理软件排行榜:哪些工具最值得关注?这11款你应该收藏!
    在2024年,项目管理软件的选择越来越依赖于团队的规模、工作流复杂性、以及行业需求。随着企业逐渐向数字化、自动化和协作化转型,优秀的项目管理工具不仅能提高工作效率,还能增强跨部门协作和团队透明度。以下是2024年值得关注的项目管理软件排行榜,涵盖了不同规模和类型的企业需求:在......
  • C#/.NET/.NET Core技术前沿周刊 | 第 12 期(2024年11.01-11.10)
    前言C#/.NET/.NETCore技术前沿周刊,你的每周技术指南针!记录、追踪C#/.NET/.NETCore领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿,助力技术成长与视野拓宽。欢迎投稿、推荐或自荐优质文章、项目、学习资源等......
  • 数据结构 ——— 链式二叉树oj题:对称二叉树
    目录题目要求手搓一个对称二叉树代码实现 题目要求给你一个二叉树的根节点 root ,检查它是否轴对称手搓一个对称二叉树代码演示://数据类型typedefintBTDataType;//二叉树节点的结构typedefstructBinaryTreeNode{ BTDataTypedata;//每个节点的数据......
  • 11.11
    实验12:外观模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解外观模式的动机,掌握该模式的结构;2、能够利用外观模式解决实际问题。 [实验任务一]:计算机开启在计算机主机(Mainframe)中,只需要按下主机的开机按钮(on()),即可调用其他硬件设备和软件的启动方法......