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

. - 力扣(LeetCode)

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

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

思路1:二叉树性质求解,遍历每一个节点。

        递归

                1、确定递归函数的参数和返回值:参数:根节点,返回值:节点数interesting

int CountNodes(TreeNode* root){}

                2、确定终止条件:如果为空节点的话,就返回0,表示节点数为0。

if (root == NULL) return 0;

                3、确定单层递归逻辑:先求它的左子树的节点数量,再求右子树的节点数量,最后取总和再加一 (加1是因为算上当前中间节点)就是目前节点为根节点的节点数量。

int leftNum = CountNodes(root->left);      // 左
int rightNum = CountNodes(root->right);    // 右
int treeNum = leftNum + rightNum + 1;      // 中
return treeNum;
int CountNodes(TreeNode* root){if (root == NULL) return 0;int leftNum = CountNodes(root->left);      // 左int rightNum = CountNodes(root->right);    // 右int treeNum = leftNum + rightNum + 1;      // 中return treeNum;
}
// 简化版本
class Solution {
public:int countNodes(TreeNode* root) {if (root == NULL) return 0;return 1 + countNodes(root->left) + countNodes(root->right);}
};

迭代:二叉树层序遍历(队列)

class Solution {
public:int countNodes(TreeNode* root) {queue<TreeNode*> que;if(root != nullptr)que.push(root);int res = 0;while(!que.empty()){int size = que.size();for(int i = 0; i < size; i++){TreeNode* node = que.front();que.pop();res++;if(node->left) que.push(node->left);if(node->right) que.push(node->right);}}return res;}
};

思路2:满二叉树性质。左0右1,二进制排列,最后一个节点的二进制数就是总节点数。

已知满二叉树,则书高度由左子树深度h决定,所以深度为h的满二叉树的节点总数= 2^h-1,(等比数列求和 (1-2^h)/(1-2) = 2^h-1)。若最底层为第 h 层,则该层节点二进制序号(2^h ~ 2^(h+1))。

求解:总节点数 == h层最后一个节点

      1)遍历左子树,得到树高h,

      2)二分法确定叶子节点的个数(2^h ~ 2^(h+1))(根节点在第0层)

      3)位运算判断叶子节点是否存在。按照二进制编码,左孩子0,右孩子1(第12个节点,二进制表示1100),则2^h每次左移一位位与第k节点,该位为1则右子树,为0则左子树。若节点为空或者2^h左移为0结束循环,返回节点是否为空

class Solution {
public:bool exits(TreeNode* root, int h, int k ){int bits = 1 << (h-1);   // 1<<(h-1) == 2^hTreeNode* node = root;while(node != nullptr && bits > 0){// 该数二进制位,左子树为0,右子树为1// 按位相与,该位同1为1,2&3 == 010 & 011 == 010 == 2if( !(bits & k))  // 检查当前位是否为1node = node->left; //bits & k == 0,即该位为0elsenode = node->right;bits >>= 1; // 判断下一位}return node != nullptr;}int countNodes(TreeNode* root) {if(root == nullptr) return 0;int h = 0; // 默认根节点为第0层TreeNode* node = root;while(node->left != nullptr){h++;node = node->left;}int l = 1 << h, r = (1 << (h+1)) - 1;while(l < r){int mid = (r - l + 1) / 2 + l; // 求中间数,(r+l)/2会有溢位风险if(exits(root, h, mid)){l = mid;}else{r = mid - 1; // mid位置没有节点,所以-1}}return l;}
};

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

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

相关文章

Jmeter中的配置原件(五)

17--登录配置原件/素 用途 管理登录信息&#xff1a;为测试计划中的多个请求提供统一的登录信息。简化配置&#xff1a;避免在每个请求中重复配置用户名和密码。支持多种认证方式&#xff1a;支持Basic、Digest等认证方式。 配置步骤 添加登录配置元件 右键点击线程组&#…

深度解析 ArrayList:揭开源码背后的设计与实现原理

一、ArrayList 简介 ArrayList 的底层是数组队列&#xff0c;相当于动态数组。与 Java 中的数组相比&#xff0c;它的容量能动态增长。在添加大量元素前&#xff0c;应用程序可以使用ensureCapacity操作来增加 ArrayList 实例的容量。这可以减少递增式再分配的数量。 ArrayLi…

网络安全应该学什么?别被培训机构这些内容给骗了!

了解过的朋友都知道&#xff0c;网络安全内容十分丰富&#xff0c;大大小小的知识点都包含。所以有的朋友就都想学&#xff0c;尤其一些培训机构的课程大纲介绍的特别详细&#xff0c;又包含这又包含那&#xff0c;但是这些内容真的都实用吗&#xff1f;如果想系统学习&#xf…

吴恩达LLM Agent工作流Prompt设计精解

在详解和实测吴恩达4种Agentic 工作流之中&#xff0c;我测试了各种框架诸如反思、工具调用、规划、多智能体&#xff0c;在学习了其中各种Prompt设计后&#xff0c;有了一些新的认识。 对于特定的任务来说&#xff0c;没有万能的Prompt&#xff0c;只有一些通用的模式&#xf…

除了 Mock.js,前端还有更方便的 Mock 数据工具吗?

在前端开发中&#xff0c;模拟数据&#xff08;Mock Data&#xff09;是不可或缺的一部分&#xff0c;它能够帮助开发者在后端接口未完成前进行界面和逻辑的测试。而 Mock.js 是一个广泛使用的库&#xff0c;它通过简洁的语法和强大的功能&#xff0c;让前端开发者可以轻松地创…

【原创】java+ssm+mysql高校学籍管理系统设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

pytorch深度学习环境安装 + 讲解【新手版】

不知道有没有学深度学习的小伙伴在安装深度学习环境时候很头疼&#xff0c;反正我在研一时候是很头疼很头疼的一件事&#xff0c;根本搞不清楚什么显卡、显卡驱动、pytorch版本、cuda、cudnn等等等&#xff0c;这些是不是非常的头疼。 好&#xff0c;你们的救星来了。我&#x…

zabbix搭建钉钉告警流程

目录 zabbix实验规划 zabbix实验步骤 1 使用钉钉添加一个自定义的机器人 ​编辑2在zabbix-server上编写钉钉信息发送脚本&#xff0c;设置钉钉报警媒介 设置钉钉报警媒介​编辑​编辑 在添加消息模板​编辑​编辑​编辑 3设置动作条件 触发后的行为&#xff1a;重新添加一…

无人机飞手考证,地面站培训技术详解

无人机飞手考证及地面站培训技术涉及多个关键方面&#xff0c;以下是对这些方面的详细解析&#xff1a; 一、无人机飞手考证流程与要求 1. 证书类型 民用无人机驾驶员证书&#xff1a;这是国家民航局颁发的无人机操作人员资质证书&#xff0c;分为视距内驾驶员、超视距驾驶员…

高颜值的卡片折叠效果(附源码)

预览效果 源码(html部分) <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>17sucai -Holiday Feature Folding Cards [Pure CSS]</title><meta charset"UTF-8"><meta name&qu…

Mybatis的执行流程解析

根据图中步骤&#xff0c;我们可以将这个执行流程分成了8个步骤。 1、读取MyBatis的核心配置文件。mybatis-config.xml为MyBatis的全局配置文件&#xff0c;用于配置数据库连接、属性、类型别名、类型处理器、插件、环境配置、映射器&#xff08;mapper.xml&#xff09;等信息…

24年下软考系统架构设计师真题及答案,估分、备考速看!

2024下半年软考考试已经圆满结束了&#xff0c;为大家整理了网友回忆版的软考高级系统架构设计师真题真题及答案。下半年考试的宝子们可以对答案预估分数&#xff01;准备明年考的宝子可以提前把握考试知识点和出题方向&#xff0c;说不定会遇到相同考点的题目&#xff01; 一、…

手把手教你用Coze零代码搭建一个智能搜索智能体,高时效性、保姆级!

随着大模型技术的发展&#xff0c;越来越多的技术开始涌现&#xff0c;从聊天助手&#xff0c;到智能体&#xff0c;再到工作流&#xff0c;最后到三者的整合。大模型技术朝着更加智能化、通用化、个性化的方向发展&#xff0c;为人们的生活和工作带来了更多的便利和创新。 今…

HTML之列表学习记录

练习题&#xff1a; 图所示为一个问卷调查网页&#xff0c;请制作出来。要求&#xff1a;大标题用h1标签&#xff1b;小题目用h3标签&#xff1b;前两个问题使用有序列表&#xff1b;最后一个问题使用无序列表。 代码&#xff1a; <!DOCTYPE html> <html> <he…

数据结构Python版

2.3.3 双链表 双链表和链表一样&#xff0c;只不过每个节点有两个链接——一个指向后一个节点&#xff0c;一个指向前一个节点。此外&#xff0c;除了第一个节点&#xff0c;双链表还需要记录最后一个节点。 每个结点为DLinkNode类对象&#xff0c;包括存储元素的列表data、…

Linux手动安装nginx

本次以安装nginx-1.12.2为例 1、首先说明一下,安装nginx之前需要安装如下素材: 2、开始安装 第一步,安装依赖yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel第二步,下载并安装nginx安装包(nginx官网:http://nginx.org/)# 下载 wget http://nginx…

无线感知会议系列【14】SignFi: Sign Language Recognition Using WiFi

摘要&#xff1a; 这篇Paper 是用CNN 做的,用来做手语识别的 模型输入&#xff1a; csi_tensor [M,N,S,T] M: tx 发送天线数量 N: rx 天线数量 S: 幅度和相位信息 T: CSI matrix for each instance 数据集大小 模型结构,跟斯坦福的HAR LSTM 有较大差异[batch_size, time, carr…

详解AI产品经理的发展与规划(附完整PPT)

随着AI技术的逐渐普及与落地&#xff0c;AI产品经理在市场上也变得分外火热。那么在未来&#xff0c;这个职业将如何发展&#xff0c;它的工作要素有哪些&#xff0c;要怎么做才能成为一名AI产品经理呢&#xff1f; 大家好&#xff0c;近日分享一些关于AI产品经理的话题。这个…

【大数据技术基础 | 实验十】Hive实验:部署Hive

文章目录 一、实验目的二、实验要求三、实验原理四、实验环境五、实验内容和步骤&#xff08;一&#xff09;安装部署&#xff08;二&#xff09;配置HDFS&#xff08;三&#xff09;启动Hive 六、实验结果&#xff08;一&#xff09;启动结果&#xff08;二&#xff09;Hive基…

[⑧5G NR]: PBCH payload生成

本篇博客记录下5G PBCH信道中payload数据的生成方式。PBCH payload一共32个比特&#xff0c;基本结构如下图&#xff1a; 根据SSB PDU中bchPayloadFlag的值有三种方式得到PBCH payload。 bchPayloadFlag 0&#xff1a;全部32比特由MAC层提供。 bchPayloadFlag 1&#xff1a;M…