【C/C++笔记】:易错难点3 (二叉树)
选择题
🌈eg1
一棵有15个节点的完全二叉树和一棵同样有15个节点的普通二叉树,叶子节点的个数最多会差多少个()?
正确答案: C
A. 3 B. 5 C. 7 D. 9
解析:普通二叉树的叶子节点数最少为1 所以,而一棵完全二叉树最下面一层都是叶子节点,对于15个节点的完全二叉树,有 8 个叶子节点,因此最多会相差7个。
🌈eg2
一棵有 n 个结点的二叉树,按层次从上到下、同一层从左到右顺序存储在一维数组 A[1…n] 中,则二叉树中第 i 个结点(i从1开始用上述方法编号)的右孩子在数组 A 中的位置是( )
正确答案:D
A. A[2i](2i <= n)
B. A[2i + 1](2i + 1 <= n)
C. A[i - 2]
D. 条件不充分,无法确定
解析:
必须是完全二叉树才能确定,若是,选择B选项。图解如下:
根据二叉树的性质5:
1.对于具有n个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有节点从0开始编号,则对于序号为i的结点有:
1.1 若i>0,i位置节点的双亲序号:(i-1)/2;i=0,i为根节点编号,无双亲节点
1.2 若2i+1<n,左孩子序号:2i+1,2i+1>=n否则无左孩子
1.3 若2i+2<n,右孩子序号:2i+2,2i+2>=n否则无右孩子
上述的性质的节点从0开始编号, 而题目当中是从1开始编号, 所有右孩子的序号为 2i+1
🌈eg3
已知-算术表达式的中缀表达式为 a-(b+c/d)*e , 其后缀形式为( )
正确答案:D
A. -a+b*c/d
B. -a+b*cd/e
C. -+*abc/de
D. abcd/+e*-
解析:使用中缀表达式构建二叉树
- 第一个 “-”则将表达式分为左右子树, 左子树为“a”, 右子树为“(b+c/d)e”
- 在1.1中的右子树“(b+c/d)e”, 通过“”将再次分为左右子树, 左子树为“(b+c/d)”, 右子树为“e”
- 在1.2中的左子树“(b+c/d)”, 通过“+”将再次分为左右子树, 左子树为“b”, 右子树为“c/d”
- 在1.3中的右子树“c/d”, 通过“/”将再次分为左右子树, 左子树为“c”, 右子树为“d”
所以构建出来的二叉树如下图所示, 后缀表达式也就不难求解, 先左, 再右, 再根, 即“abcd/+e-”
🌈eg4
将一棵有100个结点的完全二叉树从根这一层开始,开始进行层次遍历编号,那么编号最小的叶节点的编号为(),则编号为 98 的节点的父节点编号为()。 (根节点为1)
正确答案:51, 49
解析:
由题意可知最小编号的叶子一定是最后一个节点的父节点的右兄弟节点,最后节点编号100,父节点编号为50,所以答案是51。
根节点是i,那么子节点是2i,2i+1,那么98,99的父节点就是49,
🌈eg5
设二叉树的先序遍历序列和后序遍历序列正好相反,则该二叉树满足的条件是()。
正确答案:B
A. 空或只有一个结点 B. 高度等于其结点数
C. 任一结点无左孩子 D. 任一结点无右孩子
解析:
A.如果是空,或者是只有一个结点那么先序遍历和后序遍历得到的序列是一样的。
C.在任何一个结点没有左孩子的时候D.与C同理
B.满足每一层只有一个结点,即树高等于结点的数目时题目条件成立先序遍历:根左右;后续遍历:左右根
要满足题意,则只有,根左<----->左根,根右<--------->右根
所以高度一定等于节点数
🌈eg6
某二叉树共有 399 个结点,其中 有199个为 度为2的 结点 ,则该二叉树中的叶子节点数为()
正确答案:C
A. 198 B. 199 C. 200 D. 201
解析:
由二叉树的性质可知:n2 = n0 + 1
故度为0 及叶子节点 比 度为2 (199) 多一个 ,答案为 200个
🌈eg7
在一颗度为3的树中,度为3的结点有2个,度为2的结点有1个,度为1的结点有2个,则叶子结点有( )个
正确答案:D
A. 7 B. 0 C. 7 D. 6
解析:
设度为i的节点个数为ni,则该树总共有n个节点
n = n0+n1+n2+n3.
有n个节点的树的总边数为 n-1条,根据度的定义,总边数与度之间的关系为
n-1 = 0n0+1n1+2n2+3n3
联立两个方程可得,n0 = n2 +2 n3+1, n0 =6.
🌈eg8
设一棵完全二叉树具有1000个结点,则此完全二叉树有()个度为2的结点。
正确答案:C
A. 497 B. 498 C. 499 D. 500
解析:
1、叶子结点:度为0的结点。
2、以n0代表度为0的结点,n2代表度为2的结点。
3、则根据二叉树的性质有 n0 = n2 +1。
1000个结点的完全二叉树有10层(2^9 - 1 < 1000 < 2 ^10 -1)
其中前9层为满二叉树,共有512-1=511个结点。因此有1000-511=489,说明第10层有489个结点,且第10层的结点均为叶子结点(度为0的结点)
- 而489/2 = 244…1,说明第9层有244+1(245)个结点有子结点,而根据满二叉树第9层共有 2^8 = 256个结点,则第9层度为0的结点(叶子结点)个数为 256-245 = 11。
- 再由第一步所得叶子结点个数,可得二叉树中度为2的结点数为:
n2=n0-1=500-1=499
即:度为2的结点数有499个
编程题
🎈eg1
从根到叶的二进制数之和
解析:
后序遍历的访问顺序为:左子树——右子树——根节点。我们对根节点 root 进行后序遍历:
如果节点是叶子节点,返回它对应的数字 val。
- 如果节点是非叶子节点,返回它的左子树和右子树对应的结果之和。
class Solution {
public:int dfs(TreeNode * root, int val){if(root == nullptr) return 0;val = (val << 1) | root->val; //二进制转10进制if(root->left == nullptr && root->right == nullptr) { //求叶子节点return val;}return dfs(root->left, val) + dfs(root->right, val);}int sumRootToLeaf(TreeNode* root) {return dfs(root, 0);}
};
🎈eg2
二叉树的坡度
解析:dfs,在遍历每个结点时,累加其左子树结点之和与右子树结点之和的差的绝对值,并返回以其为根结点的树的结点之和。
从根结点开始遍历
遍历 root 的左子结点,得到左子树结点之和 sl;遍历 root 的右子结点,得到右子树结点之和 sr;
- 将左子树结点之和与右子树结点之和的差的绝对值累加到结果变量 ans;
- 返回以 root 作为根结点的树的结点之和 sl + sr + node.val
class Solution {
public:int ans = 0;int dfs(TreeNode* root){if(root == nullptr) return 0;int sl = dfs(root->left);int sr = dfs(root->right);ans += abs(sl - sr);return sl + sr + root->val;}int findTilt(TreeNode* root) {dfs(root);return ans;}
};
🎈eg3
奇偶树
解析:
根据题意可知,我们需要根据 层 遍历这棵树,因此使用宽度优先搜索BFS遍历二叉树。
首先可以将root放入队列中,由于root的level=0,所以从其出发的可以直接到达点的level=1,将root从队列中弹出,然后将level=1的点放入队列中,因此现在队列的所有节点的level=1。
每次将下一层节点放入队列的时候,优先将左边先放入队列,这样就可以保证每一层是从左往右顺序的。
重复上面过程,所以从level=1出发的点,可以直接到达level=2。
在遍历每一层的时候,根据规则判断是否满足奇偶树的性质。
如果当前 层是偶数,首先判断数字的奇偶性,设
prev
的默认值为0,根据数字大小判断是否满足严格递增,并修改pre
- 如果当前 层是技术,首先判断数字的奇偶性,设
prev
的默认值为106+1,根据数字大小判断是否满足严格递减,并修改pre
。
class Solution {
public:bool isEvenOddTree(TreeNode* root) {queue<TreeNode*> q;q.push(root);int level = 0;while(!q.empty()){int sz = q.size();int pre = level == 0 ? 0 : 1e6 + 1;for(int i = 0; i < sz; i++){TreeNode* next = q.front();q.pop();// 偶数递减 奇数递增if((level == 0 && next->val <= pre) || (level == 1 && next->val >= pre)) return false;//奇偶if((level == 0 && next->val % 2 == 0) || (level == 1 && next->val % 2 == 1)) return false;pre = next->val;if(next->left) q.push(next->left);if(next->right) q.push(next->right);}level ^= 1;}return true;}
};
相关文章:

【C/C++笔记】:易错难点3 (二叉树)
选择题 🌈eg1 一棵有15个节点的完全二叉树和一棵同样有15个节点的普通二叉树,叶子节点的个数最多会差多少个()? 正确答案: C A. 3 B. 5 C. 7 D. 9 解析:普通二叉树的叶子节…...
一篇文章解决Webpack
一:什么是webpack webpack是一个用于现代JavaScript应用程序的静态模块打包工具。本质是一个软件包, 静态模块包括以下:html、css、js、图片等固定内容的文件 二:webpack工作原理 当 webpack 处理应用程序时,它会在内…...
速盾:cdn如何解析php文件中的图片?
CDN(Content Delivery Network)是一种通过分布在全球各地的服务器来加速网络内容传输的技术。CDN通过将内容缓存在离用户最近的服务器上,提供更快的访问速度和更好的用户体验。在解析PHP文件中的图片时,CDN可以起到以下几个方面的…...

如何快速实现MODBUS TCP转Profinet——泗博网关EPN-330
泗博网关EPN-330可作为PROFINET从站,支持与西门子S7-200 SMART/300/400/1200/1500全系列PLC以及具有PROFINET主站的系统无缝对接,而Modbus TCP端,可以与Modbus TCP从站设备、主站PLC、DCS系统以及组态软件等进行数据交互。 通过EPN-330&…...

什么是实时数据仓库?它有哪些不可替代之处?
【实时数据仓库】可以分开来理解: ✅【实时数据】:即能够快速处理数据,且几乎无延迟的提供最新的数据的能力。 ✅【仓库管理】:可以理解为对仓库的库存控制、对仓库的存储优化以及协调物流。 那么实时数据仓库就是:…...

《Ubuntu22.04环境下的ROS2学习笔记1》
一、在ROS2环境下创建工作空间 ROS2相比ROS1来说工作空间的创建有较大的不同,同时工作空间中的四个目录被更换为src(存放源码) , build(存放编译的中间文件) , install(存放可执行文件) , log(日志)。同时命令行也有些许变化&…...
Jupyter nbextensions安装与使用
Jupyter nbextensions的安装与使用主要包括以下几个步骤: 一、安装步骤 确保已安装Jupyter Notebook 如果尚未安装Jupyter Notebook,可以使用pip命令进行安装: pip install jupyter 安装nbextensions 使用pip命令安装nbextensions包&#x…...

java.nio.charset.MalformedInputException: Input length = 1
1、问题 项目启动报错: Exception in thread "main" org.yaml.snakeyaml.error.YAMLException: java.nio.charset.MalformedInputException: Input length 1提示原因: Caused by: java.nio.charset.MalformedInputException: Input length 1…...
yarn的安装和配置使用
文章目录 一、前言二、yarn简介三、yarn的特点四、yarn安装五、配置yarn5.1 全局配置5.2 项目配置 五、使用yarn六、yarn常用命令七、版本管理 一、前言 Yarn是facebook发布的一款取代npm的包管理工具,本文给大家介绍yarn的安装和使用,最详细教程&#…...

JVM知识总结(即时编译)
文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 即时编译 Java编译器经过解释执行,其执行速度必然会比…...

【网络】TCP协议——TCP连接相关、TCP连接状态相关、TCP数据传输与控制相关、TCP数据处理和异常、基于TCP应用层协议
文章目录 Linux网络1. TCP协议1.1 TCP连接相关1.1.1 TCP协议段格式1.1.2 确定应答(ACK)机制1.1.3 超时重传机制 1.2 TCP连接状态相关1.2.1 TIME_WAIT状态1.2.2 CLOSE_WAIT 状态 1.3 TCP数据传输与控制相关1.3.1 滑动窗口1.3.2 流量控制1.3.3 拥塞控制1.3.4 延迟应答1.3.5 捎带应…...
一起看看JavaAgent到底是干啥用的
JavaAgent 简介 定义: JDK提供的一种能力,允许开发者在运行时对已有class代码进行注入和修改。用途: 增强和修改类执行,如IntelliJ IDEA使用JavaAgent增强JVM行为实现调试功能。 JavaAgent 工作原理 premain 方法: JavaAgent的入口点,接收…...

k8s工作负载控制器--DaemonSet
文章目录 一、概述二、适用场景三、基本操作1、官网的DaemonSet资源清单2、字段解释3、编写DaemonSet资源清单4、基于yaml创建DaemonSet5、注意点5.1、必须字段5.2、DaemonSet 对象的名称5.3、.spec.selector 与 .spec.template.metadata.labels之间的关系 6、查看DaemonSet6.1…...

探索Python文档自动化的奥秘:MkDocs的神奇之旅
文章目录 **探索Python文档自动化的奥秘:MkDocs的神奇之旅**第一部分:背景为什么选择MkDocs? 第二部分:MkDocs是什么?MkDocs:文档生成的瑞士军刀 第三部分:如何安装MkDocs?一键安装&…...
树莓派边缘计算网关搭建:集成MQTT、SQLite与Flask的完整解决方案
一、项目概述 随着物联网(IoT)的快速发展,边缘计算的应用越来越广泛。边缘计算可以将数据处理和分析推向离数据源更近的地方,从而降低延迟,提高效率。本文将介绍如何利用树莓派构建一个多协议边缘计算网关,…...

如何通过GD32 MCU内部ADC参考电压通道提高采样精度?
ADC采样精度受很多因素影响,比如电源波动、参考电压波动、输入信号波动等,GD32 MCU内部提供了一个参考电压通道,理论上可以优化由于电源和参考电压较大波动引入的采样误差。 如下图所示,GD32F303 ADC内部17通道为VREFINT参考电压…...
Centos安装OpenSearch
Centos安装OpenSearch 下载并安装OpenSearch下载OpenSearch RPM包导入公共GNU Privacy Guard(GPG)密钥。此密钥验证您的OpenSearch实例是否已签名安装RPM包安装完设置开机自启动OpenSearch启动OpenSearch验证OpenSearch是否正确启动 测试OpenSearch向服务…...

【pkill pgrep】Centos/Linux pkill命令详细介绍
【pkill & pgrep】Centos/Linux pkill命令详细介绍 简介 基础语法 选项介绍 退出状态 基本用法 注意事项 简介 系统版本:Centos7.6 pkill命令用于杀死一个进程,会根据进程名称和其他属性杀死进程(默认会向进程发送SIGTERM信号&…...
Java如何使用 HTTP 请求下载图片
工具类: public FileInputStream fileDownload(String fileLink) throws Exception {System.out.println("开始下载"fileLink);// 转码中文URL url new URL(encodeURLChinese(fileLink));System.out.println("fileLink:"url);// 开始下载Trust…...
ARM/Linux嵌入式面经(二十):地平线嵌入式开发
一面 1、自己介绍一下项目 一个清晰、结构化的表达能极大地提升你的专业形象。所以一定要养成结构性的回答,真的铁子,信我。 项目介绍示例 项目名称:智能温控系统 项目背景: 该项目旨在开发一款应用于智能家居环境的智能温控系统,通过精准控制室内温度,提高居住舒适度…...

汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...

2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
LOOI机器人的技术实现解析:从手势识别到边缘检测
LOOI机器人作为一款创新的AI硬件产品,通过将智能手机转变为具有情感交互能力的桌面机器人,展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家,我将全面解析LOOI的技术实现架构,特别是其手势识别、物体识别和环境…...

使用SSE解决获取状态不一致问题
使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件,这个上传文件是整体功能的一部分,文件在上传的过程中…...
规则与人性的天平——由高考迟到事件引发的思考
当那位身着校服的考生在考场关闭1分钟后狂奔而至,他涨红的脸上写满绝望。铁门内秒针划过的弧度,成为改变人生的残酷抛物线。家长声嘶力竭的哀求与考务人员机械的"这是规定",构成当代中国教育最尖锐的隐喻。 一、刚性规则的必要性 …...