二叉树理论和题目

二叉树的种类

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

满二叉树

满二叉树:如果一棵二叉树只有度为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.mzph.cn/bicheng/4662.shtml

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

相关文章

机器学习Sklean基础教程

Scikit-learn&#xff08;也称为 sklearn&#xff09;是一个使用 python 语言的机器学习模块&#xff0c;内置了大量的监督和无监督学习算法&#xff0c;主要用于数据挖掘和数据分析。 以下是一个简单关于如何使用 sklearn 进行机器学习的指导&#xff1a; 安装: 首先&#…

如何使用SOCKS5代理?

SOCKS5 是一个代理协议&#xff0c;在使用TCP/IP协议通讯的前端机器和服务器机器之间扮演一个中介角色&#xff0c;使得内部网中的前端机器变得能够访问Internet网中的服务器&#xff0c;或者使通讯更加安全。那么&#xff0c;SOCKS5代理该如何使用呢&#xff1f; 首先需要获取…

Matlab实现CNN-LSTM模型,对一维时序信号进行分类

1、利用Matlab2021b训练CNN-LSTM模型&#xff0c;对采集的一维时序信号进行分类二分类或多分类 2、CNN-LSTM时序信号多分类执行结果截图 训练进度&#xff1a; 网络分析&#xff1a; 指标变化趋势&#xff1a; 代码下载方式&#xff08;代码含数据集与模型构建&#xff0c;附…

【Docker】常见命令汇总

1 镜像相关 1.1 查看镜像 # 查看镜像列表 docker images# 查看具体的镜像: sudo docker images <镜像名称> docker images centos # 指定具体 tag: sudo docker images centos:<tag> docker images centos:7.8.2003# 查看镜像 ID 列表: --q/--quiet docker ima…

BERT一个蛋白质-季军-英特尔创新大师杯冷冻电镜蛋白质结构建模大赛-paipai

关联比赛: “创新大师杯”冷冻电镜蛋白质结构建模大赛 解决方案 团队介绍 paipai队、取自 PAIN AI&#xff0c;核心成员如我本人IvanaXu(IvanaXu GitHub)&#xff0c;从事于金融科技业&#xff0c;面向银行信用贷款的风控、运营场景。但我们团队先后打过很多比赛&#xf…

社交媒体数据恢复:Rocket Chat

Rocket.Chat 数据恢复方法 1. 数据备份 在探讨数据恢复方法之前&#xff0c;重要的是要了解Rocket.Chat有一个自动备份功能。这个备份功能可以将你的数据定期备份到/var/snap/rocketchat-server//backup.tgz1 。如果你的Rocket.Chat服务器已经启用了这个自动备份功能&#xf…

如何最大程度使用AWS?

随着云计算技术的不断发展&#xff0c;AWS已经成为众多企业的首选&#xff0c;为其提供了强大的基础设施和服务。那么如何最大程度地、灵活地利用AWS&#xff0c;成为许多企业专注的焦点。九河云作为AWS的合作伙伴&#xff0c;为读者们提供一些技巧和策略&#xff0c;帮助读者充…

延时任务通知服务的设计及实现(四)-- webhook执行任务

一、本文内容 本文将简单梳理下&#xff0c;延迟任务通知服务的webhook模块实现。 这里的回调接口&#xff0c;请求方式约定为post&#xff0c;参数通过body传递参数。 实现比较简单&#xff0c;先梳理其流程图&#xff0c;再是简单的代码实现。 二、流程图 三、异步执行任…

【项目构建】04:动态库与静态库制作

OVERVIEW 1.编译动态链接库&#xff08;1&#xff09;编译动态库&#xff08;2&#xff09;链接动态库&#xff08;3&#xff09;运行时使用动态库 2.编译静态链接库&#xff08;1&#xff09;编译静态库&#xff08;2&#xff09;链接静态库&#xff08;3&#xff09;运行时使…

【链表——数据结构】

文章目录 1.单链表1.定义2.基本操作2.1.不带头结点2.2后插2.3前插2.4删除2.5按位查找2.6按值查找2.7求单链表长度2.8 建表 2.双链表1.初始化2.插入(后插)3.删除(后删)4.遍历 3.循环链表1.循环单链表2.循环双链表3.代码问题 4.静态链表1.简述基本操作的实现1.初始化3.删除某个结…

学习Rust的第21天:mini_grep第1部分

在本文中&#xff0c;我们开始用 Rust 构建一个类似 grep 的程序。我们涵盖了读取命令行参数、读取文件内容&#xff0c;并开始通过将程序构造为函数和结构体来重构程序。 Introduction 介绍 Running the following command will create a new project 运行以下命令将创建一个新…

应急学院物联网应急安全产教融合基地解决方案

第一章 背景 1.1物联网应急安全产教融合发展概况 物联网应急安全产教融合发展是当前社会发展的重要趋势。随着物联网技术的广泛应用&#xff0c;应急安全领域对人才的需求日益迫切。因此&#xff0c;产教融合成为培养高素质、专业化人才的关键途径。在这一背景下&#xff0c;…

02.Kafka部署安装

1 Linux 安装 Kafka 1.1 安装前的环境准备 由于 Kafka 是用 Scala 语言开发的&#xff0c;运行在 JVM 上&#xff0c;因此在安装Kafka之前需要先安装JDK。 yum install java-1.8.0-openjdk* -y kafka 依赖 zookeeper&#xff0c;所以需要先安装 zookeeper。 wget https://ar…

vue3——(模板应用,组件)

模板应用 Vue3 的模板应用和之前的版本基本一致&#xff0c;但是在一些关键点上有所不同。 Composition API Vue3 引入了 Composition API&#xff0c;这是一种全新的 API 设计风格&#xff0c;可以更好地组织代码&#xff0c;提高代码的复用性和可读性。与之前的 Options AP…

golang netpoller揭秘

golang netpoller是网络IO模型的核心部分&#xff0c;利用了操作系统提供的事件通知机制&#xff0c;如Linux的epoll、BSD的kqueue或者windows的IOCP。这些机制允许应用程序监视多个文件描述符&#xff08;在网络编程中&#xff0c;通常是 socket&#xff09;&#xff0c;并在其…

LLM优化:开源星火13B显卡及内存占用优化

1. 背景 本qiang~这两天接了一个任务&#xff0c;部署几个开源的模型&#xff0c;并且将本地经过全量微调的模型与开源模型做一个效果对比。 部署的开源模型包括&#xff1a;星火13B&#xff0c;Baichuan2-13B, ChatGLM6B等 其他两个模型基于transformers架构封装&#xff0…

【Linux】Centos7安装部署asterisk,搭建 SIP服务器

1、安装环境依赖 yum install -y make gcc zlib-devel perl wget yum install -y gcc gcc-c autoconf libtool automake make yum install -y openssl-devel &#xff08;以上需要联网安装&#xff0c;离线安装各种依赖需要进一步研究&#xff09; openssl version Open…

表单提交出现问题却没有报错

最近搞毕设提交表单传给后台总是出现错误&#xff0c;有时候可以运行成功&#xff0c;有时候运行不了但是没有报错&#xff0c;以为是jQuery导入的问题尝试换了jQuery的其他导入方式没有解决&#xff0c;后来发现前端页面的表单要防止默认操作&#xff01;&#xff01;&#xf…

CMUS狮身人面像(六)-调整语音识别准确性

调整语音识别准确性 精度差的原因测试数据库设置运行测试 语音识别的准确性并不总是很高。 首先&#xff0c;重要的是要了解您的准确性是否只是低于预期&#xff0c;还是总体上非常低。如果总体精度非常低&#xff0c;则您很可能错误配置了解码器。如果低于预期&#xff0c;可…

qt学习篇---C++基础学习

本学习笔记学习下面视频总结&#xff0c;感兴趣可以去学习。讲的很详细 【北京迅为】嵌入式学习之QT学习篇_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1tp4y1i7EJ/?spm_id_from333.337.search-card.all.click&vd_source8827cc0da16223b9f2ad8ae7111de9e2 目录 C…