Leetcode:222. 完全二叉树的节点个数(C++)

news2024/12/24 8:51:59

目录

问题描述:

实现代码与解析:

直接当普通二叉树遍历:

利用完全二叉树和满二叉树的特性:

原理思路:


问题描述:

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

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

示例 1:

输入:root = [1,2,3,4,5,6]
输出:6

示例 2:

输入:root = []
输出:0

示例 3:

输入:root = [1]
输出:1

实现代码与解析:

直接当普通二叉树遍历:

class Solution {
public:
    void traveral(TreeNode* cur,vector<int>& result)
    {
        if(cur==NULL) return;
        result.push_back(cur->val);
        traveral(cur->left,result);
        traveral(cur->right,result);
    }
    int countNodes(TreeNode* root) 
    {
        vector<int> result;
        traveral(root,result);
        return result.size();

    }
};

        这里可以用前中后序递归,非递归,层序遍历把结点放入数组中,然后计算数组大小即可。

当然也可以直接递归返回结点个数如:

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* left=root->left;
        TreeNode* right=root->right;
        int leftDepth=0;//左子树深度
        int rightDepth=0;//右子树深度
        //左子树一直向左
        while(left)
        {
            leftDepth++;
            left=left->left;
        }
        //右子树一直向右
        while(right)
        {
            rightDepth++;
            right=right->right;
        }
        if(leftDepth==rightDepth) return (2<<leftDepth)-1;//满二叉树的结点计算公式
        int leftCount=countNodes(root->left);
        int rightCount=countNodes(root->right);
        return leftCount+rightCount+1;       
    }
};

原理思路:

        可以和当作普通二叉树解题的代码对比着看,会发现,其实就是多了一个终止条件,也就是下面这几行代码:

        TreeNode* left=root->left;
        TreeNode* right=root->right;
        int leftDepth=0;//左子树深度
        int rightDepth=0;//右子树深度
        //左子树一直向左
        while(left)
        {
            leftDepth++;
            left=left->left;
        }
        //右子树一直向右
        while(right)
        {
            rightDepth++;
            right=right->right;
        }
        if(leftDepth==rightDepth) return (2<<leftDepth)-1;//满二叉树的结点计算公式

这样我们就不用遍历所有结点了,减少了运算时间,下面说说这个多出的终止条件是什么意思。

        其实就是判断一下所遍历到的子树是否为满二叉树,这样我们就可以直接利用满二叉树的公式 2^n-1 来计算出此子树的结点个数,直接返回,例如:

return (2<<leftDepth)-1;

        leftDepth也可以换成rightDepth,毕竟是相等的时候才这样返回嘛。这里用了位运算,当leftDepth=1时就等同于( 2 ^ 2 ) - 1 = 3。      

        然后来说说我们是如何判断该子树为满二叉树的呢,只要我们沿着子树的左侧一直向左,右侧一直向右,若两侧深度相同则就是满二叉树,也就是这几行代码:

        //左子树一直向左
        while(left)
        {
            leftDepth++;
            left=left->left;
        }
        //右子树一直向右
        while(right)
        {
            rightDepth++;
            right=right->right;
        }

这时候就有人要问了,会不会出现下面这种情况:

        

        答案很明显,是不会出现这种情况的,因为题目已经说了给的是完全二叉树,这种情况都不是完全二叉树,所以显然是不会出现这种情况的,若左右深度相同,中间结点一定是满的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/144525.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

js实现纯前端压缩图片

演示 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>压缩图片</title> </head> <bo…

php学习笔记-phpday1

php代码基本语法 PHP&#xff08;PHP: Hypertext Preprocessor&#xff09;即“超文本预处理器”&#xff0c;是在服务器端执行的脚本语言&#xff0c;尤其适用于Web开发并可嵌入HTML中。PHP语法学习了C语言&#xff0c;吸纳Java和Perl多个语言的特色发展出自己的特色语法&…

【自学C++】C++ HelloWorld

C HelloWorld C HelloWorld教程 我们打开 Dev-C 软件&#xff0c;界面如下&#xff1a; 我们选择文件 -> 新建 -> 源代码&#xff0c;如下图所示&#xff1a; 点击源代码之后&#xff0c;此时界面如下图所示&#xff1a; 我们在新建的文件中&#xff0c;输入以下内容&a…

用远见超越未见 | 立足2022,洞见未来之2023十大安全技术趋势

2022年是极不平凡的一年&#xff0c;外部的世界局势逐步恶化&#xff0c;内部的新冠疫情转段迈向新阶段。2022年也是伟大的一年&#xff0c;党的二十大胜利召开。党的二十大报告就“推进国家安全体系和能力现代化&#xff0c;坚决维护国家安全和社会稳定”作出专章部署&#xf…

三万字机器学习项目整理(基础到进阶)

如果你是学生、计算机领域的工作者&#xff0c;我强烈建议你学习、掌握机器学习&#xff0c;我不敢说它是最简单的&#xff08;机器学习的确很简单&#xff09;&#xff0c;但是掌握机器学习一定是性价比最高的。 本文用浅显易懂的语言精准概括了机器学习的相关知识&#xff0…

jQuery(JS库) | 一文带你掌握jQuery的使用

目录 一&#xff1a;开篇基础 1. 为什么使用 jQuery 2. DOM 对象 3. JS对象和 jQuery 对象 4. 获取 jQuery 5. 牛刀小试 6. DOM 对象和 jQuery 对象 二&#xff1a;选择器 1. 基本选择器 2. 表单选择器 三&#xff1a;过滤器 1. 基本过滤器 2. 表单对象属性过滤器…

天津人才引进迁出迁入延期经验分享

由于2022年疫情&#xff0c;集体户口折腾了5个月终于告与段落了&#xff0c;只能说2022年点真得太背了。。。把自己的痛苦经验分享给大家乐乐。。。 迁出找人代办&#xff0c;获得准迁证后&#xff0c;个人证件比准迁证提前将近2天开始邮寄&#xff0c;但最后还比准迁证晚到了1…

做几个链表相关的练习题吧!!

对于链表&#xff0c;笔者在之前就已经有过几篇文章&#xff0c;详细的讲解了&#xff01;感兴趣的各位老铁&#xff0c;请进入博主的主页进行查找&#xff01;https://blog.csdn.net/weixin_64308540/?typeblog言归正传&#xff01;对于链表&#xff0c;光学不做&#xff0c;…

浅谈 Redis 的切片集群

切片集群&#xff0c;也叫分片集群&#xff0c;就是指启动多个 Redis 实例组成一个集群&#xff0c;然后按照一定的规则&#xff0c;把收到的数据划分成多份&#xff0c;每一份用一个实例来保存。回到我们刚刚的场景中&#xff0c;如果把 25GB 的数据平均分成 5 份&#xff08;…

stm32f407VET6 系统学习 day08 SPI 的使用 和 flash 的讲解

1.什么是SPI控制器 SPI 是英语Serial Peripheral interface的缩写&#xff0c;顾名思义就是串行外围设备接 口。是Motorola首先在其MC68HCXX系列处理器上定义的。 SPI&#xff0c;是一种高速的&#xff0c;全双工&#xff0c;同步的通信总线&#xff08;因为带有SCL同步时钟&am…

2023年PMP备考攻略全指南看这里就够了!

PMP考试是一年四次的&#xff0c;一般在3月、6月、9月、12月份考试&#xff08;考试时间一般为周六&#xff09;。 所以如果有想法一定要在这个几个时间点之间备考准备哦。 二&#xff0c;报名流程 一般都是中英文两个官网都报名 1.英文报名 需要在PMI官方网站提交填写申请…

【Linux】软件包管理器yum和编辑器vim

文章目录一、Linux软件包管理器yum1. 什么是软件包2. 查看软件包/安装软件/卸载软件3. 关于rzsz二、Linux编辑器vim1. vim的基本概念2. vim的基本操作3. vim命令模式指令集4. vim底行模式指令集5. vim的配置三、普通用户无法使用sudo的问题一、Linux软件包管理器yum 1. 什么是…

学习周报-20230106

文章目录一 Linux常用系统日志一 常用系统日志二 系统日志优先级三 其他日志文件二 DNS域名解析一 定义二 配置文件三 DNS解析流程四 总结三 vim编辑器的三种模式四 Linux虚拟机克隆后网卡名从eth0变成eth1一 系统环境二 问题发现三 解决过程五 在rhel6系统部署iscsi远程存储一…

项目资源规划前需要了解的基础知识

项目资源规划是优化各项目资源使用的一个可靠方法。你根据团队成员的技能、能力和对项目的适应性将任务分配给他们&#xff0c;以实现最大效率。 换句话说&#xff0c;规划项目资源的过程可以帮助你回答项目经理可能提出的两个最重要的问题。 ● 如何确保在团队不过度劳累的情…

零基础学MySQL(一)-- 启动与创建数据库及对数据库的备份与恢复

&#x1f9e7;启动与创建数据库及对数据库的备份与恢复&#x1f957;一、启动与连接数据库1️⃣启动数据库2️⃣连接数据库&#x1f96b;二、数据库的基本介绍1️⃣数据库的三层结构2️⃣数据在数据库中的存储方式3️⃣SQL 语句分类&#x1f371;三、对数据库的操作1️⃣创建数…

Python 读取千万级数据自动写入 MySQL 数据库

Python 读取数据自动写入 MySQL 数据库&#xff0c;这个需求在工作中是非常普遍的&#xff0c;主要涉及到 python 操作数据库&#xff0c;读写更新等&#xff0c;数据库可能是 mongodb、 es&#xff0c;他们的处理思路都是相似的&#xff0c;只需要将操作数据库的语法更换即可。…

react+openlayers实现点要素的创建及其点上overlay叠加层的实现

前言 网上关于react或者vue3与openlayers结合的案例非常少&#xff0c;今天由于工作中用到&#xff0c;特记录下笔记&#xff0c;后面将持续更新react和vue3与ol的结合案例&#xff08;新手勿喷&#xff09;。 1.地图上要素&#xff08;点线面&#xff09;的创建 以点要素为…

C进阶:数据在内存中的存储

深度剖析数据在内存中的存储C进阶:数据在内存中的存储深度剖析数据在内存中的存储数据类型介绍类型的基本归类整型家族浮点数家族&#xff1a;构造类型&#xff1a;指针类型&#xff1a;空类型&#xff1a;整型在内存中的存储原码、反码、补码原码反码补码的相互转换整型数据的…

基于WebRtc的web播放大华海康rtsp视频流(延迟一秒以内)

基于WebRtc的web播放大华海康rtsp视频流&#xff08;延迟一秒以内&#xff09;WebRtc下载WebRtc运行Rtc测试Rtc使用html播放需要在vue上播放的可以看下一篇文章WebRtc你好&#xff01; 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可…

谷粒学院——第十七章、课程微信支付

需求分析 需要实现的功能 需要提供的接口 后端实现 创建数据库表 创建 service_order 模块 引入依赖 <dependencies><dependency><groupId>com.github.wxpay</groupId><artifactId>wxpay-sdk</artifactId><version>0.0.3</ve…