二叉树的基础讲解

news2024/11/24 12:05:01

二叉树在遍历,查找,增删的效率上面都很高,是数据结构中很重要的,下面我们来基础的认识一下。(高级的本人还没学,下面的代码用伪代码或C语言写的)我会从树,树的一些专有名词,树的遍历,二叉树,二叉树的遍历以及后面升级的树进行一部分的介绍。

首先我们从最开始的树来进行讲解,我们知道链表是节点上一个连下一个形成一条长链,一个节点只能连接一个节点。而我们的树就是一个节点连接多个节点,就和我们生活中的树相似,一个点可以分出很多枝干。

下面就是开头节点连接四个节点的树,而树可以有很多的节点。

那么树的结构这么复杂多变,需要理清他们的结构关系。例如A我们要叫什么,H我们要叫什么?

树的相关专业名词

这里的名词是通过日常的树的一些名词和我们人与人之间关系组合形成的。所以结合这两部分可以更好记忆。我也会结合上面的这颗树来进行举例。

这里面打勾的是比较重要的。

节点✔

节点我们在链表里面就有讲过,不多说明。这里的A B C D E F G H都是节点

根节点

根节点就是树的起点节点这里的A就是根节点

双亲节点或父亲节点✔

一个节点的上一个节点就是他的父亲节点或双亲节点。例如A是B的父亲节点或双亲节点

孩子节点或子节点✔

一个节点的直接连接的下一个节点就是它的子节点或孩子节点例如B C D E都是A的孩子节点或子节点

节点的度

一个节点含有子树(或者可以说孩子节点)个数就是节点的度例如这里A的度是4,因为有B C D E四个树或者四个孩子节点。

树的度✔

根节点的度就是树的度例如上面的这颗树的度就是4。

非终端节点或分支节点

度不为零的节点,通俗说就是有孩子的节点这里除了F H D E都是分支节点。

兄弟节点

父亲节点是同一个的节点是兄弟节点,这里可以结合家庭关系理解并记忆。例如这里B C是兄弟,F G不是兄弟,但是是下面要说的堂兄弟节点。

节点的层次

就是节点在第几层,这里层次从上往下增长,一般定义根节点是第一层或者第零层。这里的B是第二层或者第一层(分别对应根节点的第一层和第零层)。

树的高度或深度✔

树的最大层次。如图的最大层次是4。

堂兄弟节点

双亲在同一层的节点互为堂兄弟。例如F G就是堂兄弟。

节点的祖先

从根到该节点所经分支上的所有节点。例如A是所有节点的祖先

子孙

以某节点为根的子树中任一节点都称为该节点的子孙。上如除了A的节点都是A的子孙。

森林

由m(m>0)棵互不相交的树的集合称为森林。

多叉树的遍历

因为树的节点个数不缺定,所以我们要借助其他的数据结构来存储我们一个节点的子节点。

例如我们要遍历上图的A,我们先遍历A里面的内容,然后再将A的所有节点写进栈里面,或者队列里面,然后我们进行循环,如果栈或者队列为空我们就停止循环。每次出数据的时候我们就将它的子节点全部存进这个数据结构里。这样我们就可以完成所有节点的遍历。

伪代码如此,我不会写伪代码,大概看看吧。

第二种是比较厉害的处理办法,不需要运用的任何数据结构,但是树的创建结构需要改变一下

我们将上面的树结构改成这样,我们增强层之间的联系,而亲子之间只让两个之间有联系。这样遍历的顺序就是A->B里面所有节点->C里面所有节点->D里面所有节点->E里面所有节点。这个需要用到递归来处理。这里我用C语言来写一下

首先是树的定义和树的创建,结构和上面图是一样的:

这里结构体的创建孩子的节点决定于所有节点中节点最大孩子数。

然后是遍历函数和main函数

结果也是对的

树的运用

像我们电脑、手机里面的文件夹就是一个多叉树,一个文件夹就相当于一个节点,文件夹里面的内容就是子文件夹

二叉树

二叉树是树里面特殊的一种树,每个节点的孩子节点<=2。二叉树因为只分了左右节点可以很好的控制数据关系,更好的进行相关的数据操作。

下面就是二叉树的一些主要出现的操作,如果能自主写的到这些,那么二叉树的基础部分掌握的相对牢固:

二叉树的三种特殊情况

满二叉树

设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个树,第 h 层所有的结点都连续集中在最左边,而满二叉树是完全二叉树的一种

完全二叉树

深度为k且有2^k-1个结点的二叉树

平衡二叉树

 1,左子树与右子树的高度之差的绝对值小于等于1;

 2,左子树和右子树也是平衡二叉树.

二叉树里面的恒等式

叶子节点数=度为2的节点的个数+1

二叉树的遍历

二叉树的遍历是认识二叉树最重要的一点,或许大家在大学里面学习了二叉树的遍历——前中后序遍历,但是大多数人是没有真正了解三个序具体过程是怎么来的。

二叉树因为涉及多叉也是要用递归来遍历的,或者用数据结构进行存储。

我们一下面这颗二叉树来进行分析三个序。

这颗树的手工创建代码如下

前序

前序遍历遵从的是先遍历节点的内容,再遍历节点的左子树,在遍历节点的右子树。

下面进行分析:

首先声明:这颗树有点大,如果下面的分析看不懂可以先从黑体字开始看,就是A左子树B的遍历。

要遍历这颗二叉树,先要遍历A节点,那么先遍历A节点的值是'A',然后遍历A的左子树B。遍历B先遍历它的值是'B',然后遍历B的左子树D,遍历D先遍历值'D',然后遍历D的左子树G,遍历G先遍历它的值'G',然后遍历G的左子树,G的左子树是NULL,所以为空,再遍历G的右子树也是空的。G遍历完了,标志D的左子树遍历完了,我们要遍历D的右子树,右子树为NULL,D遍历完,标志B的左子树遍历完了。现在要遍历B的右子树E,欲遍历E要遍历E的值'E',然后遍历E的左子树H,要遍历H先遍历H的值然后依次遍历左右子树都为空,那么E的左子树遍历完了遍历E的右子树I,I也是同样操作,欲遍历I先遍历I的值'I',然后遍历I的左子和右子树都为空,遍历完标志E的右子树遍历完了,就标志B的右子树遍历完了,即B树遍历完了,就标志A的左子树遍历完了。然后就要遍历A的右子树,先遍历C,先遍历C的值'C',然后遍历C的左子树为空,然后遍历C的右子树F,先遍历F的值'F',然后遍历F的左子树J,先遍历J的值'J',然后遍历J左右子树都为空,然后遍历F右子树K,先遍历K的值'K',然后遍历K的左右子树都是空,然后F遍历完,标志C的右子树遍历玩标志A的右子树遍历完。最后标志这颗树遍历完。

最终的遍历顺序是A->B->D->G->NULL->NULL->NULL->E->H->NULL->NULL->I->NULL->NULL->C->NULL->F->J->NULL->NULL->K->NULL->NULL

而我现在写的过程也是递归调用的全过程。

那么我们开始写它的递归代码:

就是这么简单,其实打印NULL的代码也不需要,但这里主要是看遍历的流程。函数的递归流程是和上面流程一模一样的。

我们也可以看到程序遍历的和我们分析出来的是一样的。

中序

中序是先遍历左子树,再遍历节点数据,再遍历右子树。

只要把前序看懂了,中序就是水到渠成的事。

依然是上面的这张图,我们再分析一下。这次我只分析A的左子树B:

要遍历B,先遍历B的左子树D,要遍历D先遍历左子树G,要遍历G先遍历G左子树为空,然后遍历G值,然后遍历G右子树,G遍历完了标志D左子树遍历完了,然后遍历D值,然后遍历D右子树为空,然后D树遍历完标志B的左子树遍历完,然后遍历B值,然后遍历B的右子树E,先遍历E的左子树H,先遍历H左子树为空,然后遍历H值,然后遍历H的右子树为空,然后H遍历完标志E的左子树遍历完了,然后遍历E值,然后E的右子树I,先遍历I左子树为空,然后遍历I值,然后遍历右子树为空,然后标志E遍历完,标志B右子树遍历完,标志B树遍历完。

A的右树你们自己来试一试,最后结果是:

NULL->G->NULL->D->NULL->B->NULL->H->NULL->E->NULL->I->NULL->A->NULL->C->NULL->J->NULL->F->NULL->K->NULL

写代码也很好写,交换一下位置就行了

后序

先遍历节点左子树,然后遍历节点右子树,然后是遍历节点的值。

后序我不会说过程了,请大家自己尝试。

答案是

NULL->NULL->G->NULL->D->NULL->NULL->H->NULL->NULL->I->E->B->NULL->NULL->NULL->J->NULL->NULL->K->F->C->A

然后是代码和运行结果:

下面我再出几个题

答案:

前:A B NULL E H NULL NULL I NULL NULL C NULL F J NULL NULL K NULL NULL

中:NULL B NULL H NULL E NULL I NULL A NULL C NULL J NULL F NULL K NULL

后:NULL NULL NULL H NULL NULL I E B NULL NULL NULL J NULL NULL K F C A

答案:

前:A B D G NULL NULL I NULL NULL NULL C H NULL NULL F J NULL NULL K NULL NULL

中:NULL G NULL D NULL I NULL B NULL A NULL H NULL C NULL J NULL F NULL K NULL

后:NULL NULL G NULL NULL I D NULL B NULL NULL H NULL NULL J NULL NULL K F C A

模拟前序(深搜)

我们在树的遍历就说到用数据结构存储节点,这里我们就来用栈来实现实现。

栈的函数就自己写或者CV一下,不会的可以看我的相关博客。

(忘记栈的销毁了,记得销毁,养成习惯)

层序(广搜)

层序就是一层一层遍历,就是按顺序遍历,那么这个按顺序我们就想到了队列。

(忘记队列的销毁了,记得销毁,养成习惯)

二叉树的其他函数

这些函数也是需要会写的

这里面有几个已经写了就不写了

首先是二叉树的构建

二叉树销毁


二叉树节点个数


二叉树叶子节点个数


二叉树第k层节点个数


二叉树查找值为x的节点


判断二叉树是否是完全二叉树

这个需要讲一下,完全二叉树是最后一个层序值前面都不能有NUL,当出现NULL看后面还有没有NULL就行了.

普通二叉树的缺陷

我们创造二叉树最后是为了查找快速,二叉树的查找是类似于二分的,时间复杂度是logN,速度非常快。但是如果我们二叉树建立的比较特殊,所有的节点都是在上一个节点的做子树上,将会变成一条链表,时间复杂度也降为N。所以会有更高级的二叉树来弥补这个缺陷。

高级数据结构里面的树

据我现在了解后面会有平衡二叉树(AVL树),红黑树(二叉树),B树,B+树(多叉)等树。这些树我也不知道长什么样,但是可以时刻保持logN的时间复杂度。

另外这些高阶树会和哈西表进行结合,将红黑树挂到哈西表的每个格子上,让时间复杂度进一步减小。总之学习数据结构的道路还很漫长.......

求赞和关注

都看到这里了,求大家点赞关注一下吧😊

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

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

相关文章

Unity API学习之资源的动态加载

资源的动态加载 在实际游戏开发的更新换代中&#xff0c;随着开发的软件不断更新&#xff0c;我们在脚本中需要拖拽赋值的变量会变空&#xff0c;而要想重新拖拽又太花费时间&#xff0c;因此我们就需要用到Resources.Load<文件类型>("文件名")函数来在一开始…

【尚庭公寓SpringBoot + Vue 项目实战】租约管理(十四)

【尚庭公寓SpringBoot Vue 项目实战】租约管理&#xff08;十四&#xff09; 文章目录 【尚庭公寓SpringBoot Vue 项目实战】租约管理&#xff08;十四&#xff09;1、业务介绍2、逻辑介绍3、接口开发3.1、保存或更新租约信息3.2、根据条件分页查询租约列表3.3、根据ID查询租…

生成对抗网络——GAN(代码+理解)

目录 一、GAN模型介绍 二、GAN模型的训练过程 1. 初始化网络&#xff1a; 2. 训练判别器&#xff1a; 3. 训练生成器&#xff1a; 4. 重复步骤 2和步骤 3&#xff1a; 三、GAN实现 1. 模型结构 &#xff08;1&#xff09;生成器&#xff08;Generator&#xff09; &a…

动态 ETL 管道:使用非结构化 IO 将 AI 与 MinIO 和 Weaviate 的 Web

在现代数据驱动的环境中&#xff0c;网络是一个无穷无尽的信息来源&#xff0c;为洞察力和创新提供了巨大的潜力。然而&#xff0c;挑战在于提取、构建和分析这片浩瀚的数据海洋&#xff0c;使其具有可操作性。这就是Unstructured-IO 的创新&#xff0c;结合MinIO的对象存储和W…

存储器的分类以及介绍

1.存储器的分类 2.按存储介质分 按照存储介质可以分为三类&#xff0c;电/磁/光 1.半导体存储器&#xff08;电&#xff09; 存储元件由半导体器件组储层的存储器称为半导体存储器。 现代的半导体存储器都是超大规模集成电路工艺制成芯片。 其优点是&#xff1a;体积小、功…

Nature 苏浩团队发表创新人工智能“仿真中学习”框架,实现外骨骼的智能性和通用性

北京时间2024年6月12日23时&#xff0c;美国北卡罗来纳州立大学与北卡罗来纳大学教堂山分校的苏浩团队在《自然》&#xff08;Nature&#xff09;上发表了一篇关于机器人和人工智能算法相结合服务人类的突破性研究论文&#xff0c;标题为“Experiment-free Exoskeleton Assista…

transformers 不同精度float16、bfloat16、float32加载模型对比

参考&#xff1a; https://github.com/chunhuizhang/pytorch_distribute_tutorials/blob/main/tutorials/amp_autocast_mixed_precision_training.ipynb from transformers import AutoModelForCausalLM, AutoTokenizer device "cuda" # the device to load the m…

MySQL初学知识总篇

MySQL入门篇 MySQL下载并安装教程推荐&#xff1a;聚精会神搞学习的文章 图形化工具使用&#xff1a;Dbeaver下载官网 目录 &#x1f349;概述&#xff1a;什么是MySQL&#xff1f;一、&#x1f349;MySQL语言特点&#xff1a;二、&#x1f349;数据库管理系统&#xff08;数据…

家庭智能助手:Kompas AI引领家居智能化新纪元

一、引言 在数字化浪潮的推动下&#xff0c;现代家庭生活正迅速向智能化转型。从简单的自动化设备到复杂的智能家居系统&#xff0c;智能技术正悄无声息地改变我们的日常生活。Kompas AI作为一款前沿的家庭智能助手&#xff0c;不仅预示着家庭生活的未来趋势&#xff0c;更以其…

Unity EasyRoads3D插件使用

一、插件介绍 描述 Unity 中的道路基础设施和参数化建模 在 Unity 中使用内置的可自定义动态交叉预制件和基于您自己导入的模型的自定义交叉预制件&#xff0c;直接创建独特的道路网络。 添加额外辅助对象&#xff0c;让你的场景栩栩如生&#xff1a;桥梁、安全护栏、栅栏、墙壁…

不可思议!这款 Python 库竟然能自动生成GUI界面:MagicGUI

目录 什么是MagicGUI&#xff1f; ​编辑 MagicGUI的工作原理 安装MagicGUI 创建你的第一个GUI ​编辑 其他案例 输入值对话框 大家好&#xff0c;今天我们来聊一聊一个非常有趣且实用的Python库——MagicGUI。这个库可以让你用最少的代码&#xff0c;快速创建图形用户…

GStreamer——教程——基础教程7:Multithreading and Pad Availability

基础教程7&#xff1a;多线程和Pad可用性 目标 GStreamer自动处理多线程&#xff0c;但是在某些情况下&#xff0c;用户可能需要手动解耦线程。这篇教程将展示如何解耦线程以及完善关于Pad Availability的描述。更准确来说&#xff0c;这篇文档解释了&#xff1a; 如何为pipe…

不会策划营销活动?教你一步步成为策划高手

要想让活动大获成功&#xff0c;不仅需要创意十足&#xff0c;更要有严谨的策划和执行&#xff0c;确实新人会有点感觉不知所措。 但其实也不用怕&#xff0c;只要按照以下五个关键步骤&#xff0c;一步步来&#xff0c;也可以轻松策划及格的好活动。 步骤一&#xff1a;锁定目…

AIGC绘画设计基础——十分钟读懂Stable Diffusion

写在最前面&#xff1a; 由于Stable Diffusion里面有关扩散过程的描述&#xff0c;描述方法有很多版本&#xff0c;比如前向过程也可以叫加噪过程&#xff0c;为了便于理解&#xff0c;这里把各种描述统一说明一下。 Diffusion扩散模型&#xff1a;文章里面所有出现Diffusion…

志全重庆官网下载

baidu搜索&#xff1a;如何联系八爪鱼SEO? baidu搜索&#xff1a;如何联系八爪鱼SEO? baidu搜索&#xff1a;如何联系八爪鱼SEO? 现在越来越多的人抱怨说搜索引擎收录很难做,站群程序似乎不在是那么重要, 花费高价购买域名成为了做出高收录站群的越来越重要的建站前提。实上…

Python文本处理:初探《三国演义》

Python文本处理&#xff1a;初探《三国演义》 三国演义获取文本文本预处理分词与词频统计引入停用词后进行词频统计分析人物出场次数结果可视化完整代码 三国演义 《三国演义》是中国古代四大名著之一&#xff0c;它以东汉末年到晋朝统一之间的历史为背景&#xff0c;讲述了魏…

2024下《软件设计师》50个高频考点汇总,背就有效!

宝子们&#xff01;上半年软考已经结束一段时间了&#xff0c;准备考下半年软考中级-软件设计师的小伙伴们可以开始准备了&#xff0c;这里给大家整理了50个高频考点&#xff0c;涵盖全书90%以上重点&#xff0c;先把这个存下&#xff01;再慢慢看书&#xff0c;边看书边背这个…

CNN和Transformer创新结合,模型性能炸裂!

CNN结合Transformer 【CNNTransformer】这个研究方向通过结合卷积神经网络&#xff08;CNN&#xff09;的局部特征提取能力和Transformer的全局上下文建模优势&#xff0c;旨在提升模型对数据的理解力。这一方向在图像处理、自然语言处理等多个领域展现出强大的应用潜力&#…

告诉你提升UI质感的两个秘密,谁用谁知道。

秘密一&#xff1a;善用头部装饰 秘密二&#xff1a;设计好瓷片区

老电脑焕发第二春,玩转 Stable Diffusion 3

几年前&#xff0c;我头脑一热&#xff0c;配置了一台顶配级消费 PC&#xff08;RTX 2080 Ti GPU i9 CPU&#xff09;&#xff0c;打算用来学习 AI。然而&#xff0c;起初我并没有找到合适的切入点。深度学习早期阶段&#xff0c;消费级显卡根本无法承担训练大模型、微调大模型…