数据结构第十讲:二叉树OJ题

数据结构第十讲:二叉树OJ题

  • 1.单值二叉树
  • 2.相同的树
  • 3.对称二叉树
  • 4. 另一棵树的子树
  • 5.二叉树的前序遍历
  • 6.二叉树的中序遍历
  • 7.二叉树的后序遍历
  • 8.二叉树的构建及其遍历
  • 9.二叉树选择题
    • 9.1二叉树性质1
    • 9.2二叉树性质2
    • 9.3二叉树性质三
    • 9.4选择题

1.单值二叉树

链接: OJ题链接
在这里插入图片描述

typedef struct TreeNode TreeNode;bool isUnivalTree(struct TreeNode* root) {//这一题要对二叉树结点进行逐一遍历,这里要用到递归//递归结束条件:if(root == NULL){return true;}if(root->left && root->left->val != root->val){return false;}if(root->right && root->right->val != root->val){return false;}//我们想要的是每个结点都具有相同的值,所以就需要左树和右树上结点的数据都相同return isUnivalTree(root->left) && isUnivalTree(root->right);
}

2.相同的树

链接: OJ题链接
在这里插入图片描述

typedef struct TreeNode TreeNode;bool isSameTree(struct TreeNode* p, struct TreeNode* q) {//要检查两棵树是否相同,就要同时遍历两棵树的结点,还是要用到递归//递归结束条件//当两个结点全为空时,返回trueif(p == NULL && q == NULL){return true;}//当两个结点不全为空//当两个结点中有一个为空时,说明两棵树不同if(p == NULL || q == NULL){return false;}//当两棵树的结点值不同时,返回falseif(p->val != q->val){return false;}//最后要得到的是两棵树是否相同,就要看两棵树的左节点树和右节点树是否相同return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}

3.对称二叉树

链接: OJ题链接
在这里插入图片描述

这一题和上一题差不多,属于上一题的拓展,需要注意的是,这一题要求的是是否对称,而上一题要求的是是否相同,对称要求一棵树的左结点和另一棵树的右节点相同,就这一点与上一题不同

typedef struct TreeNode TreeNode;bool isSameTree(struct TreeNode* p, struct TreeNode* q) {//要检查两棵树是否对称,就要同时遍历两棵树的结点,还是要用到递归//递归结束条件//当两个结点全为空时,返回trueif(p == NULL && q == NULL){return true;}//当两个结点不全为空//当两个结点中有一个为空时,说明两棵树不同if(p == NULL || q == NULL){return false;}//当两棵树的结点值不同时,返回falseif(p->val != q->val){return false;}//此时要求的是是否对称,所以递归对比的是左结点和右结点return isSameTree(p->left, q->right) && isSameTree(p->right, q->left);
}bool isSymmetric(struct TreeNode* root) {if(root == NULL){return true;}//这里只需要检查二叉树根结点的左节点树和右节点树是否对称即可//与上一题不同的是,这里要求检查是否对称,不是相同,所以函数的内部实现要特别注意:return isSameTree(root->left, root->right);
}

4. 另一棵树的子树

链接: OJ题链接
在这里插入图片描述

这一题仍然需要利用相同的树那一题的方法,不同的是,对于这一题的返回值,return的应该是左树中存在目标子树右树中存在目标子树,只要一颗树中存在目标子树,就返回true

typedef struct TreeNode TreeNode;bool isSameTree(struct TreeNode* p, struct TreeNode* q) {//要检查两棵树是否相同,就要同时遍历两棵树的结点,还是要用到递归//递归结束条件//当两个结点全为空时,返回trueif(p == NULL && q == NULL){return true;}//当两个结点不全为空//当两个结点中有一个为空时,说明两棵树不同if(p == NULL || q == NULL){return false;}//当两棵树的结点值不同时,返回falseif(p->val != q->val){return false;}//最后要得到的是两棵树是否相同,就要看两棵树的左节点树和右节点树是否相同return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot){//递归结束条件:if(root == NULL){return false;}if(isSameTree(root, subRoot)){return true;}//对于返回值,只要左右树中有一棵树中存在目标子树,就需要返回truereturn isSubtree(root->left, subRoot) || isSubtree(root->right, subRoot);
}

5.二叉树的前序遍历

链接: OJ题链接
在这里插入图片描述

这一题与之前所写的前序遍历不同,之前所写的前序遍历都是将数直接打印出来,而这里的前序遍历要求将遍历的数依次存储在数组中,而且,题目还有一个提示:在这里插入图片描述
也就是说,函数返回的是一个数组,数组是由动态内存开辟的空间

typedef struct TreeNode TreeNode;int TreeSize(TreeNode* root)
{//递归结束条件if(root == NULL){return 0;}//需要返回的是根节点的数目+左节点树的结点树+右结点树的结点数return 1 + TreeSize(root->left) + TreeSize(root->right);
}void TreePreOrder(TreeNode* root, int* arr, int* i)
{if(root == NULL){return;}arr[(*i)++] = root->val;TreePreOrder(root->left, arr, i);TreePreOrder(root->right, arr, i);
}int* preorderTraversal(struct TreeNode* root, int* returnSize) {//1.首先,我们要确定需要开辟空间的大小,然后开辟空间//注意,这里要用*returnSize表示结点个数,从函数声明中可以分析得出*returnSize = TreeSize(root);int* arr = (int*)malloc((*returnSize)*sizeof(int));//2.其次就是递归遍历二叉树的结点,然后将结点的值存储在数组中int i = 0;TreePreOrder(root, arr, &i);return arr;
}

后续还要实现二叉树的中序遍历和二叉树的后续遍历,思路和这一个是一样的,自行实现即可

6.二叉树的中序遍历

链接: OJ题链接

typedef struct TreeNode TreeNode;int TreeSize(TreeNode* root)
{if(root == NULL){return 0;}return 1 + TreeSize(root->left) + TreeSize(root->right);
}void TreeInOrder(TreeNode* root, int* arr, int* i)
{if(root == NULL){return;}TreeInOrder(root->left, arr, i);arr[(*i)++] = root->val;TreeInOrder(root->right, arr, i);
}int* inorderTraversal(struct TreeNode* root, int* returnSize) {//1.先求出需要开辟空间的大小*returnSize = TreeSize(root);//2.开辟空间int* arr = (int*)malloc((*returnSize) * sizeof(int));//3.将数据通过中序遍历进行存储int i = 0;TreeInOrder(root, arr, &i);return arr;
}

7.二叉树的后序遍历

链接: OJ题链接

typedef struct TreeNode TreeNode;int TreeSize(TreeNode* root)
{if(root == NULL){return 0;}return 1 + TreeSize(root->left) + TreeSize(root->right);
}void TreeInOrder(TreeNode* root, int* arr, int* i)
{if(root == NULL){return;}TreeInOrder(root->left, arr, i);TreeInOrder(root->right, arr, i);arr[(*i)++] = root->val;
}int* postorderTraversal(struct TreeNode* root, int* returnSize) {//1.先求出需要开辟空间的大小*returnSize = TreeSize(root);//2.开辟空间int* arr = (int*)malloc((*returnSize) * sizeof(int));//3.将数据通过后序遍历进行存储int i = 0;TreeInOrder(root, arr, &i);return arr;
}

8.二叉树的构建及其遍历

链接: OJ题链接

与力扣的题目不同,这道题出自于牛客网,所给出的不仅仅是一个片段,是一段程序的接口,而是自己手动实现全部的代码:在这里插入图片描述
在这里插入图片描述
这道题中,数组插入二叉树的结构应该为:
在这里插入图片描述
下面的CreatTree方法应该好好记着

//二叉树结点结构体
typedef struct TreeNode
{char val;struct TreeNode* left;struct TreeNode* right;
}TreeNode;TreeNode* CreatTreeNode(char x)
{TreeNode* newnode = (TreeNode*)malloc(sizeof(TreeNode));newnode->val = x;newnode->left = newnode->right = NULL;return newnode;
}
//--------------------------------------------------------------------------------
TreeNode* CreatTree(char* arr, int* i)
{//对于树的创建是一个新的方法,要好好记着//此方法仍需要使用到递归//递归结束条件:当arr中的数据为#时,代表遇到的是NULL,此时需要返回NULL被存储if(arr[(*i)] == '#'){(*i)++;return NULL;}//当不为空时,开辟空间即可TreeNode* root = CreatTreeNode(arr[(*i)++]);root->left = CreatTree(arr, i);root->right = CreatTree(arr, i);//我们需要返回的是头结点return root;
}
//--------------------------------------------------------------------------------
void TreeInOrder(TreeNode* root)
{if(root == NULL){return;}TreeInOrder(root->left);printf("%c ", root->val);TreeInOrder(root->right);
}int main() {//1.创建一个数组,使用数组接收传入的字符串char arr[100];//题目要求长度不超过100,所以这里可以直接写scanf("%s", arr);//2.其次就是使用结构体来接受这些数据//将数组中的数据挨个放到二叉树中int i = 0;TreeNode* root = CreatTree(arr, &i);//3.树创建完成之后,就是简单的中序遍历TreeInOrder(root);return 0;
}

9.二叉树选择题

9.1二叉树性质1

对于任意一颗二叉树,如果度为0的结点的个数为n0,度为2的结点的个数为n2,则有:n0 = n2+1

证明上述性质:
在这里插入图片描述
在这里插入图片描述

9.2二叉树性质2

对于一棵二叉树,假设它:
前序排列:EFHIGJK
中序排列:HFIEJKG
后序排列:HIFJKGE
前序排列首先访问的是根节点,后序排列最后访问的是根节点,中序访问中间访问的是根节点,可以根据根节点的位置推出左子树和右子树
在这里插入图片描述

9.3二叉树性质三

对于完全二叉树来说,它拥有的度为1的结点只能有0/1个:
当完全二叉树有2n个结点时,度为1的结点有1个
当完全二叉树有2n+1个结点时,度为1的结点有0个

9.4选择题

//二叉树基本性质选择题
1. 某⼆叉树共有 399 个结点,其中有 199 个度为 2 的结点,则该⼆叉树中的叶⼦结点数为( )
//不是完全二叉树,399个结点,度为2的结点数为199,所以叶子结点个数 = 度为2的结点个数+1 = 200
A 不存在这样的⼆叉树
B 200//√
C 198
D 1992.在具有 2n 个结点的完全⼆叉树中,叶⼦结点个数为( )
//完全二叉树,2n个结点,度为1的结点个数为1,假设度为2的结点个数为x
//则叶子结点个数为x+1,那么2*x+1+1 = 2n,求得x = n-1,那么叶子结点个数为n-1+1 = n
A n//√
B n + 1
C n - 1
D n / 23.⼀棵完全⼆叉树的结点数位为531个,那么这棵树的⾼度为( )
//完全二叉树,假设数的高度为h,那么结点数为2的h次方-1,2的10次方为1024
//2的9次方为512,512《531《1024,所以数的高度为10
A 11
B 10//√
C 8
D 124.⼀个具有767个结点的完全⼆叉树,其叶⼦结点个数为()
//完全二叉树,767个结点,偶数,度为1的结点数为1,设叶子结点数为x
//那么度为2的结点数为x-1,则有2x-1 = 767,所以x = 384
A 383
B 384//√
C 385
D 386//链式二叉树遍历选择题
1.某完全⼆叉树按层次输出(同⼀层从左到右)的序列为 ABCDEFGH 。该完全⼆叉树的前序序列为( )
//这一题很简单,自己画图写出前序遍历即可
A ABDHECFG//√
B ABCDEFGH
C HDBEAFCG
D HDEBFGCA2.⼆叉树的先序遍历和中序遍历如下:先序遍历:EFHIGJK; 中序遍历:HFIEJKG.则⼆叉树根结点为( )
//先序遍历先访问的是根节点,所以直接选A
A E//√
B F
C G
D H3.设⼀课⼆叉树的中序遍历序列:badce,后序遍历序列:bdeca,则⼆叉树前序遍历序列为____。
//后序遍历最后访问的是根节点,所以根节点为a,然后根据中序遍历画图即可
A adbce
B decab
C debac
D abcde//√4.某⼆叉树的后序遍历序列与中序遍历序列相同,均为 ABCDEF ,则按层次输出(同⼀层从左到右)
的序列为( )
//仍然是自己依据性质画图
A FEDCBA//√
B CBAFED
C DEFCBA
D ABCDEF

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

『python爬虫』beautifulsoup库获取文本的方法.get_text()、.text 和 .string区别(保姆级图文)

目录 区别.string(不推荐用).text(get_text的简化版少敲代码的时候用).get_text(推荐用,功能强大,为什么不爱呢?) 示例代码总结 欢迎关注 『python爬虫』 专栏,持续更新中 欢迎关注 『python爬虫』 专栏,持续更新中 区别 省流直接看get_text 推荐用这个…

【Git】如何优雅地使用Git中的tag来管理项目版本

目录 tagtag 和 branch区别操作命令打tag,当前分支标记tag提交到远程服务器删除本地tag删除远程tag切换到特定的tag查看所有tag查看标签详细信息 好书推荐 tag Git中的tag(标签)用于给项目在特定时间点(某个版本发布)…

分布式事务-使用队列实现最终一致性

分布式事务-扣减库存 一、最终一致性架构图 1、服务 左侧:创建订单服务Server1 右侧:扣减库存服务Server2 中间:独立消息服务Server3 2、中间件: Kafka-MQ、MySQL-db 二、步骤 0、定义MQ,三个状态 prepareconf…

OBS Studio:如何打造专业级的视频直播体验

1.简介 OBS(Open Broadcaster Software)是一款开源的视频录制和直播软件,广泛用于视频制作、游戏直播和网络直播。它支持多种操作系统,包括Windows、macOS和Linux。OBS提供了丰富的功能,包括但不限于: **…

【React】详解 index.js 文件

文章目录 一、index.js文件的基本结构1. 引入必要的模块2. 渲染根组件3. 注册服务工作者(可选) 二、index.js文件的详细解析1. ReactDOM.render的作用2. 为什么使用React.StrictMode3. 服务工作者的注册 三、index.js文件的最佳实践1. 使用模块化引入2. …

vue2使用wangeditor5及word导入解析的实现与问题

安装 wangeditor5 官网:https://www.wangeditor.com/v5/ yarn add wangeditor/editor # 或者 npm install wangeditor/editor --saveyarn add wangeditor/editor-for-vue # 或者 npm install wangeditor/editor-for-vue --save mammoth.js 官网:https…

一款功能强大的屏幕演示工具,免费版足够使用!

鼠标换肤 | 屏幕画笔 | 放大镜 | 聚光灯 | 屏幕放大 | 倒计时,功能强大的屏幕演示工具 屏幕演示工具适用于Windows平台,特别是Windows 10及以上版本。该软件提供了多种实用功能,包括鼠标换肤、屏幕画笔、放大镜、聚光灯、屏幕放大和倒计时等…

MyBatis的example.createCriteria()方法学习记录

目录 一、mapper的crud方法:1. insert方法insert(User user)insertSelective(User user) 2. select方法selectByPrimaryKey(id)selectByExample(example)selectCountByExample(example) 3. update方法updateByPrimaryKey(User user)updateByPrimaryKeySelective(User user)upda…

el-table 表格序号列前端实现递增,切换分页不从头开始

<el-table-column type"index" width"55" label"序号" :index"hIndex"> </el-table-column> 分页 <el-pagination size-change"handleSizeChange" current-change"handleCurrentChange"> <…

Day29 | 动态规划 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯

语言 Java 509. 斐波那契数 斐波那契数 题目 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a; F(0) 0&#xff0c;F(1) 1 F(n) F(n -…

Java 中的缓冲流

字符流 前面学习的字节流和字符流都是基本流&#xff0c;其中字符流的底层其实已经在内存中创建了一个长度为8192的字节数组作为缓存区。而字节流中则是没有的。 在内存中增加缓冲区的目的是为了减少内存与硬盘的交互的次数&#xff0c;因为这一操作比较耗时。 下面是一个图…

Pr2024苹果(mac)版剪辑软件安装下载(附下载链接)

Adobe Premiere Pro 2024&#xff08;简称PR 2024&#xff09;是一款由Adobe公司开发的专业视频编辑软件&#xff0c;被广泛应用于电影、电视、广告和社交媒体视频的制作。以下是对PR 2024的详细简介&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1rN-3kB3KQgn0JswDa…

基于PFC和ECN搭建无损RoCE网络的工作流程分析

无损RoCE网络概念 RDMA&#xff08;Remote Direct Memory Access&#xff0c;远程直接内存访问&#xff09;是一种为了解决网络传输中服务器端数据处理延迟而产生的技术。RDMA 将用户应用中的数据直接传入服务器的存储区&#xff0c;通过网络将数据从一个系统快速传输到远程系…

Leetcode第136场双周赛题解(c++)

题外话 也是好久没有更新力扣比赛的题解了&#xff0c;前段时间也是比较忙&#xff08;说的好像现在不忙一样哈哈&#xff09;&#xff0c;像我等菜鸟&#xff0c;一般都是保二进三四不写的&#xff0c;笑死。 题目一.求出胜利玩家的数目 给你一个整数 n &#xff0c;表示在…

MySQL·事务

目录 事务是用来做什么的&#xff1f; 什么是事务&#xff1f; 为什么会出现事务 事务提交方式 事务操作前提了解 事务常见操作方式 读未提交(RU) 读提交(RC) 可重复读(RR) 串行化 一致性(Consistency) 事务是用来做什么的&#xff1f; CURD不加控制&#xff0c;会…

Phalco安装过程以及踩的一些坑(mac环境)

一 背景 公司用Phalcon框架好长时间了,中途发现了一些Phalcon使用的上的问题,于是想在本地搭建一套Phalcon的环境,方便排查问题使用。 二 Mac系统下的安装 看了很多说法,最终发现还是官网给力,安装Phalcon使用下列命令即可(前提条件是PHP已安装好,工具pecl也安装好了):…

现代C++多线程编程:C++20 jthread全面解析

目录 一、引言 二、jthread 的基本特点和优势 自动 join 机制 线程取消功能 相对于 std::thread 的改进和便利 三、jthread 的工作原理 线程的生命周期管理 线程取消机制的实现和使用方法 四、jthread 的实际应用案例 服务器编程中的应用 高性能计算中的应用 实时系…

JVM知识总结(内存结构)

文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 内存模型 内存结构 堆&#xff1a; 存放对象实例, 几乎所有的对象…

GUI:Tkinter(一)

Tkinter文档 一&#xff0c;Tkinter基本流程 1. 创建应用程序主窗口对象 from tkinter import * window Tk() window.mainloop()#开启主循环 2. 在主窗口中&#xff0c;添加各种可视化组件&#xff0c;比如&#xff1a;按钮&#xff08;Button&#xff09;、文本框&#x…

[CP_AUTOSAR]_系统服务_DEM模块(三)功能规范之诊断事件定义

目录 1、诊断事件定义1.1、Event priority&#xff08;事件优先级&#xff09;1.2、Event occurrence&#xff08;事件发生计数器&#xff09;1.3、Event kind&#xff08;事件类别&#xff09;1.4、Event destination&#xff08;故障内存&#xff09;1.5、Diagnostic monitor…