二叉树理论和题目

news/2024/5/15 12:25:50

二叉树的种类

在我们解题过程中二叉树有两种主要的形:满二叉树和完全二叉树。

满二叉树

满二叉树:如果一棵二叉树只有度为0的结点和度为 2 的结点,并且度为 0 的结点在同一层上,则这棵二叉树为满二叉树。

这棵二叉树为满二叉树,也可以说深度为 k,有2^k-1个节点的二叉树。

完全二叉树

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

二叉搜索树

前⾯介绍的树,都没有数值的,而二叉搜索树是有数值的了,二叉搜索树是⼀个有序树。

若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;

若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;

它的左、右子树也分别为二叉排序树

二叉树的存储方式

链式存储

顺序存储

如果父节点的数组下标是 i,那么它的左孩子就是 i * 2 + 1,右孩⼦就是 i * 2 + 2。

二叉树的遍历方式

二叉树的递归顺序

二叉树的迭代遍历

前序遍历

前序遍历是中左右,每次先处理的是中间节点,那么先将根节点放入栈中,然后将右孩子加入栈,再加入左孩子。

为什么要先加入右孩子,再加入左孩子呢?因为这样出栈的时候才是中左右的顺序。

中序遍历

分析一下为什么刚刚写的前序遍历的代码,不能和中序遍历通用呢,因为前序遍历的顺序是中左右,先访问的元素是中间节点,要处理的元素也是中间节点,所以刚刚才能写出相对简洁的代码,因为要访问的元素和要处理的元素顺序是一致的,都是中间节点。

那么再看看中序遍历,中序遍历是左中右,先访问的是二叉树顶部的节点,然后一层一层向下访问,直到到达树左面的最底部,再开始处理节点(也就是在把节点的数值放进result数组中),这就造成了处理顺序和访问顺序是不一致的。

那么在使用迭代法写中序遍历,就需要借用指针的遍历来帮助访问节点,栈则用来处理节点上的元素。

后序遍历

叉树层序遍历

需要借用一个辅助数据结构即队列来实现,队列先进先出,符合一层一层遍历的逻辑,而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。

题目一

这是二叉搜索树吗?

代码:

# include <stdio.h>struct node
{int val;struct node * left;struct node * right;
};int n;
int num[1000];int treemade(int l, int r, struct node* root)//二叉搜索树
{if (l > r)return 1;int stand = num[l];int help = l + 1;while (help < r && num[help] < stand)help++;int mid = help;while (help < r && num[help] >= stand)help++;if (help < r )//若大与小与部分拼不成一个完整序列,则说明不符合return 0;root = (struct node*) malloc(sizeof(struct node));root->val = num[l];root->left = NULL;root->right = NULL;return (treemade(l+1, mid-1, root->left) && treemade(mid, r, root->right));}void cmp(struct node* root, int cnt)
{if (root->left != NULL)cmp(root->left, cnt+1);if (root->right != NULL);cmp(root->right, cnt+1);if (cnt == 0)  //特判printf("%d", root->val);elseprintf("%d ", root->val);
}int main()
{scanf("%d", &n);for (int i=0; i<n; ++i)scanf("%d");struct node* root;root = NULL;if (treemade(0, n, root));//判断能否建成二叉搜索树{printf("YES\n");cmp(root);}}

题目二

解题

在后序遍历序列中,根节点总是在最后一个位置,而在中序遍历序列中,根节点将序列分为左右两部分,分别对应左子树和右子树。

因此,我们可以利用两个数组的信息,递归构建二叉树,然后再进行层序遍历。

# include <stdio.h>
int n;
int num1[31];
int num2[31];struct node
{int val;struct node* left;struct node* right;
};void treemade(int l, int r, struct node* root, int k)
{int flag = 0;if (k < 0)return;int help = num1[k];int mid;for (int i=l; i<=r; ++i){if (num[i] == help){mid = i;flag = 1;break;}}if (flag == 1){root = (struct node*)malloc(sizeof(struct node));root->val = help;root->left = NULL;root->right = NULL;	treemade(l, mid-1, root->left, k-1);treemade(mid+1, r, root->right, k-1);}else{treemade(l, r, root, k-1);}
}int main()
{scanf("%d", &n);for (int i=0; i<n; ++i)scanf("%d", &num1[i]);for (int i=0; i<n; ++i)scanf("%d", &num2[i]);int k = n-1;struct node* root = NULL;}


http://www.mrgr.cn/p/84830458

相关文章

面临文件同步需求时 大文件同步方案要怎么选择?

大文件同步在企业数据管理中是一个常见的需求,但在实际操作过程中可能会遇到一系列问题,导致业务效率降低、管理困难。 面临的主要问题包括: 1、传输速度慢:大文件需要较长时间来传输,尤其是在网络带宽有限的情况下,传输效率会更低。 2、断点续传问题:在不稳定的网络环…

Swift - 枚举

文章目录 Swift - 枚举1. 枚举的基本用法2. 关联值&#xff08;Associated Values&#xff09;3. 关联值举例4. 原始值5. 隐式原始值&#xff08;Implicitly Assigned Raw Values&#xff09;6. 递归枚举&#xff08;Recursive Enumeration&#xff09;7. MemoryLayout Swift -…

【学习】如何高效地进行集成测试

在软件开发的过程中&#xff0c;测试环节至关重要。而在这其中&#xff0c;集成测试更是保证软件质量的关键步骤之一。本文将探讨如何高效地进行集成测试&#xff0c;以确保软件的稳定性和可靠性。 一、什么是集成测试 集成测试是指在单元测试的基础上&#xff0c;将模块按照设…

linux之进程信号

目录 一、进程与信号 1.进程与信号的关系 2.信号的种类​编辑 3.信号的处理方式 4.信号概念 二、 信号的产生 1.键盘组合键 2.kill命令 3.系统调用 1.kill 2.raise 3.abort 4.异常 5.软件条件 进程等待补充 三、信号的保存 1.阻塞信号 1.信号的相关概念 2…

Slave SQL线程与PXB FTWRL死锁问题分析

1. 问题背景 2.27号凌晨生产环境MySQL备库在执行备份期间出现因FLUSH TABLES WITH READ LOCK未释放导致备库复制延时拉大,慢日志内看持锁接近25分钟未释放。 版本:MySQL 5.7.21 PXB 2.4.18慢查询日志:备份脚本中的备份命令:mysql_kill.sh的主要逻辑内容:备份参数:2. 问题…

查找datafocus安装路径

1.cat /etc/profile | grep DATA2.解读下面一行 master-192-168-0-15:/df-share 表示该文件系统是通过网络文件系统 (NFS) 挂载的,其位置为 master-192-168-0-15 主机上的 /df-share 目录实际上,在主机上并没有名为 /df-share 的目录,这是一个挂载点的名称,而不是实际的目录…

大型企业文件下发时 如何确保安全又高效?

大型企业,尤其是集团型、跨国等类型的企业,会存在多个分支机构,在运营过程中经常会存在文件下发的场景,所以大型企业文件下发都是怎么做的呢? 首先来看看大型企业文件下发会涉及到哪些方面: 1、政策传达:企业的新政策、规章制度或重要通知需要下达到各个部门或分支机构…

如何调节电脑屏幕亮度?让你的眼睛更舒适!

电脑屏幕亮度的调节对于我们的视力保护和使用舒适度至关重要。不同的环境和使用习惯可能需要不同的亮度设置。可是如何调节电脑屏幕亮度呢&#xff1f;本文将介绍三种不同的电脑屏幕亮度调节方法&#xff0c;帮助您轻松调节电脑屏幕亮度&#xff0c;以满足您的需求。 方法1&…

CH592 CH582 CH573 蓝牙运行时调整RTC

前言: CH592芯片在使用蓝牙外部32K精度比较高(根据选择的外部32.768K晶体,精度一般在20ppm以内)。直接使用内部32K不校准误差约为百分之二,校准后可以做到0.1%-0.3%精度。 使用外部32K需要消耗一颗晶振的物料,同时芯片的相应GPIO会被占用。如果对于32K的误差要求不是很高…

Pod monitoring of Nodejs

一、Nodejs添加接口 1、nextjs用法 安装包prom-client,在ping同一目录层级创建接口api/ssr/metrics 比如首页https://mik.dev.platform.michaels.com/api/ssr/metrics dc项目https://mik.dev.platform.michaels.com/api/ssr/dc/metrics import { register, collectDefaultMet…

建立成功平台工程的关键:自助式 IaC

了解团队部署自助式IaC的实践方法从技术上讲,云一直都是自助式服务,但由于其在实践中的复杂性,许多开发人员并不喜欢。随着公司采用现代架构(云原生、无服务器等)和新的提供商(多云、SaaS 应用程序),以及云提供商发布更多服务,云变得更加难以使用。这就是为什么有竞争…

VS2022 配置OpenCV开发环境详细教程

OpenCV OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉和机器学习软件库&#xff0c;由Intel开发并首先发布于1999年。OpenCV被广泛用于实时图像处理、视频分析、物体检测、面部识别、机器人视觉以及许多其他领域。它支持C、Pytho…

WEBAPI传参及默认首页设置

开发工具:VS2017 创建WEBAPI, 1.选择ASP.NET Core Web应用程序2.选择如下,HTTPS配置勾选去掉,暂不配置3.“属性”中调试默认界面及launchsettings.json 4.调试以后默认页面 5.

传统FTP为何不好用了?替代FTP传文件的方式有哪些?

FTP(文件传输协议)是一种广泛使用的网络协议,用于在网络上的服务器和客户端之间传输文件。它具有一些明显的优点,比如易于使用、支持文件的上传和下载、以及能够处理多个文件和目录的传输。然而,随着时间的推移和技术的发展,FTP也暴露出一些局限性和缺点,这导致一些企业…

阿里云操作日记

昨天买了一个超级便宜的阿里云服务器&#xff0c;2核2G&#xff0c;3M固定带宽&#xff0c;40G ESSD Entry云盘&#xff0c;搭载一个简单的系统&#xff0c;就想到了docker轻量级&#xff0c;易于管理 其实docker很好用&#xff0c;第一步就是安装docker 一、docker安装与端口…

hmac测试

openssl命令: 生成hmac:验证:C语言代码实现: 代码如下:` #include #include #include #include int main() { // 这个例子中,我们将随机生成一个密钥 unsigned char key[EVP_MAX_MD_SIZE]; int key_len = 32; // OpenSSL 函数 RAND_bytes 用于生成强随机数 if (!RAND…

什么是跨域? 出现原因及解决方法

什么是跨域? 出现原因及解决方法 什么是跨域 跨域&#xff1a;浏览器对于javascript的同源策略的限制 。 同源政策的目的&#xff0c;是为了保证用户信息的安全&#xff0c;防止恶意的网站窃取数据。 设想这样一种情况&#xff1a;A 网站是一家银行&#xff0c;用户登录以后…

小程序微信及h5 发布流程

微信小程序 1 先打包代码 pnmp build:mp-wexin(package.json) 2 把代码上传到微信开发者工具 3 微信公众平台提交审核 条件编译及h5注意: 网页端不支持授权登录功能,通过条件编译进行不同平台 条件编译语法: #ifdef 或者#ifndef + 平台名称; 以#endif结尾(全局找wx. 或者…

日本宇宙航空研究“Int-Ball2”自由飞行相机机器人采用的Epson IMU

IMU有助于飞行的稳定控制和电池充电的自动对接- 精工爱普生公司&#xff08;TSE:6724&#xff0c;“Epson”&#xff09;很高兴地宣布&#xff0c;日本宇宙航空研究开发机构&#xff08;JAXA&#xff09;选择了爱普生M-G370系列的惯性测量单元&#xff08;IMU&#xff09;&…

自动化测试数据生成:Asp.Net Core单元测试利器AutoFixture详解

引言 在我们之前的文章中介绍过使用Bogus生成模拟测试数据,今天来讲解一下功能更加强大自动生成测试数据的工具的库"AutoFixture"。 什么是AutoFixture?AutoFixture 是一个针对 .NET 的开源库,旨在最大程度地减少单元测试中的“安排(Arrange)”阶段,以提高可维…