【C/C++笔记】:易错难点3 (二叉树)

news2024/11/11 5:45:44

选择题

🌈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*-

解析:使用中缀表达式构建二叉树

  1. 第一个 “-”则将表达式分为左右子树, 左子树为“a”, 右子树为“(b+c/d)e”
  2. 在1.1中的右子树“(b+c/d)e”, 通过“”将再次分为左右子树, 左子树为“(b+c/d)”, 右子树为“e”
  3. 在1.2中的左子树“(b+c/d)”, 通过“+”将再次分为左右子树, 左子树为“b”, 右子树为“c/d”
  4. 在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

  1. 1000个结点的完全二叉树有10层(2^9 - 1 < 1000 < 2 ^10 -1)

    其中前9层为满二叉树,共有512-1=511个结点。因此有1000-511=489,说明第10层有489个结点,且第10层的结点均为叶子结点(度为0的结点)

  2. 而489/2 = 244…1,说明第9层有244+1(245)个结点有子结点,而根据满二叉树第9层共有 2^8  = 256个结点,则第9层度为0的结点(叶子结点)个数为 256-245 = 11。
  3. 再由第一步所得叶子结点个数,可得二叉树中度为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;
    }
};

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

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

相关文章

Java刷题:轮转数组

目录 题目 解题思路 完整代码 题目 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解题思路 主要的解题思路是&#xff0c;先把整个数组翻转过来&a…

如何解决.NET8 类库Debug时,Debug文件夹中不包含Packages中引入的文件

最近在开发中使用了.NET8 Razor类库项目&#xff0c;但是惊讶的发现Debug时&#xff0c;Debug文件夹中不包含Packages中引入的文件&#xff0c;本以为是非常小的问题&#xff0c;但是被困住了竟然足足4个小时。 其实它也本就是个非常非常小的问题…… 只需引入<CopyLocalL…

智驭灌区,科技领航—— 高效灌区信息化系统管理平台

在水资源日益珍贵的今天&#xff0c;传统灌区的粗放式管理模式已难以满足现代农业的发展需求。我们自豪地推出——灌区信息化系统管理平台&#xff0c;以科技赋能水利&#xff0c;引领灌溉管理进入智能化、精细化新时代。 【智能决策&#xff0c;精准灌溉】 告别传统灌溉的盲目…

84.WEB渗透测试-信息收集-框架组件识别利用(8)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;83.WEB渗透测试-信息收集-框架组件识别利用&#xff08;7&#xff09; 识别的作用&#…

【初阶数据结构题目】15.有效的括号

有效的括号 点击链接答题 思路&#xff1a; 定义一个指针ps遍历字符串 若ps遍历到的字符为左括号&#xff0c;入栈 若ps遍历到的字符为右括号&#xff0c;取栈顶元素与ps进行比较&#xff0c; 栈顶元素 匹配 *ps&#xff0c;出栈&#xff0c;ps栈顶元素 不匹配 *ps&#xff0c…

【Python】nn.CTCLoss()函数详解与示例

前言 在深度学习领域&#xff0c;特别是在处理序列到序列的预测任务时&#xff0c;如语音识别和手写识别&#xff0c;nn.CTCLoss函数是一个非常重要的工具。本文将详细解析PyTorch中的nn.CTCLoss函数&#xff0c;包括其原理、原型和示例。 前言函数原理CTC算法简介CTC Loss函数…

Golang在整洁架构基础上实现事务

前言 大家好&#xff0c;这里是白泽&#xff0c;这篇文章在 go-kratos 官方的 layout 项目的整洁架构基础上&#xff0c;实现优雅的数据库事务操作。 视频讲解 &#x1f4fa;&#xff1a;B站&#xff1a;白泽talk 本期涉及的学习资料&#xff1a; 我的开源Golang学习仓库&am…

【随笔】详解Java POI及其使用方法

引言 随着企业和开发者对数据处理需求的不断增加&#xff0c;操作Excel文件已经成为日常编程工作的重要部分。在Java中&#xff0c;Apache POI&#xff08;Poor Obfuscation Implementation&#xff09;库虽然首页其貌不扬&#xff0c;但它绝对是处理Excel文件的强大工具。本文…

JavaWeb之servlet关于Ajax实现前后端分离

一、什么是Ajax: AJAX Asynchronous JavaScript and XML&#xff08;异步的 JavaScript 和 XML&#xff09;。 AJAX 不是新的编程语言&#xff0c;而是一种使用现有标准的新方法。 AJAX 最大的优点是在不重新加载整个页面的情况下&#xff0c;可以与服务器交换数据并更新部…

proteus仿真c51单片机(四)双机串口通信(电路设计及代码)

实验要求 1.通过甲机的按键给乙机发送控制字符&#xff0c;同时也可以实现乙机给甲机发送控制字符 2&#xff0e;用PROTEUS软件根据所给电路画出电路图&#xff0c;用KEIL软件调试程序和编译&#xff0c;最后在PROTEUS软件中实现仿真。 3.甲乙两个单片机通过串口进行通信&am…

Please refer to dump files (if any exist) [date].dump, [date]-jvmRun[N]……解决

一、问题 Please refer to dump files (if any exist) [date].dump, [date]-jvmRun[N].dump and [date].dumpstream.二、解决方案 1、当打包构建的时候出现这个问题&#xff0c;如果你只是打包部署&#xff0c;那么就是将maven的test禁止可以成功打包 2、当你是本地服务器启动…

前端模块化-理解Tapable与Webpack中的Hooks

前言 Webpack 中的核心架构是基于 Tapable 实现的&#xff0c;Tapable 是一个类似于 Node.js 的 EventEmitter 的库&#xff0c;专门用于实现发布-订阅模式。Webpack 中的核心组件 Compiler、Compilation、Module、Chunk、ChunkGroup、Dependency、Template 都是通过 Tapable …

Fiddler安装与使用

下载Fiddler 访问Fiddler官方网站&#xff0c;下载适用于您操作系统的最新版本Fiddler。目前&#xff0c;Fiddler支持Windows、macOS和Linux平台。 Web Debugging Proxy and Troubleshooting Tools|Fiddler (telerik.com) 安装Fiddler&#xff0c;以Windows为例 Windows用户…

gitlab给用户添加项目权限

1.进入管理员界面 2.进入群组 3.添加用户

【RISC-V设计-04】- RISC-V处理器设计K0A之架构

【RISC-V设计-04】- RISC-V处理器设计K0A之架构 文章目录 【RISC-V设计-04】- RISC-V处理器设计K0A之架构1. 简介2. 主要特点3. 结构框图4. 指令列表5. CSR指令集6. 中断返回指令7. 总结 1. 简介 在前几篇文章中&#xff0c;介绍了RISC-V处理器的结构和指令集&#xff0c;从本…

Animate软件基本概念:视频及音频

视频和音频是ANimate软件中比较重要的素材类型。 FlashASer&#xff1a;AdobeAnimate2021软件零基础入门教程https://zhuanlan.zhihu.com/p/633230084 FlashASer&#xff1a;实用的各种Adobe Animate软件教程https://zhuanlan.zhihu.com/p/675680471 FlashASer&#xff1a;A…

DSP如何进行竞价

下面根据DSP的系统构成还拆解讲解里面的各个模块&#xff0c;这一节将竞价系统&#xff0c;也就是竞价流程 0、负载均衡 增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。 1、ADX发起竞价请求 上面会携带User ID等用户信息和广告信息一大堆信息。 2、解析竞价…

fastadmin 表单添加默认搜索条件

项目场景&#xff1a;员工列表&#xff0c;查看员工邀约客户明细&#xff0c;在 dialog 窗口中的 table怎么获取当前员工的数据呢&#xff1f;看似简单的需求&#xff0c;实际操作起来还是有点考究的&#xff0c;记录一下实现步骤。 页面1&#xff1a;员工列表 页面2&#xff…

sql_day14(获取各门店的面积)

描述&#xff1a;获取各门店的面积 获取各门店的面积 门店面积信息可以从分店面积明细表中获取。 先取实际经营面积(8)&#xff0c; 如果取不到&#xff08;实际经营面积为空&#xff09;再取经营面积(7)。 如果取不到&#xff08;经营面积为空&#xff09;再取合同面积(1)。…

AI大模型赋能开发者|海云安创始人谢朝海受邀在ISC.AI 2024大会就“大模型在软件开发安全领域的应用”主题发表演讲

近日&#xff0c;ISC.AI 2024 第十二届互联网安全大会在北京国家会议中心盛大开幕。作为全球规格最高、规模最大、影响力最深远的安全峰会之一&#xff0c;本次大会以“打造安全大模型 引领安全行业革命”为主题&#xff0c;聚焦安全与AI两大领域&#xff0c;吸引了众多行业领袖…