【数据结构】——树和二叉树相关概念(全网超级详解)

 

 创作不易,家人们来一波三连吧?!

前言

世界上最大的树--雪曼将军树,这棵参天大树不是最长也不是最宽,是不是很奇怪,大只是他的体积是最大的,看图片肯定是感触不深,大家可以自己去看看

 扯远了,这次我们介绍的是一种新的数据结构--树

树的定义

之前的栈和队列,都是一对一的线性结构,而现在是一对多的数据结构--" 树 "。

树是由n个结点的有限集。当n=0的时候,也称之为空树,当n>1的时候,其余结点又可以分为m棵子树,同时这些子树是互不相交的。在任意一颗非空树中:有且仅有一个称为根的结点,也就是最上面的结点。

从图中可以看出,B,C是A的子树,D又是B的子树,其中,A为根结点

 

上面两张图就是对于定义里面的子树是互不相交的,,所以这两棵树是错误的画法。

结点的分类 

树的结点包含一个数据元素和指向若干子树的分支

1.结点拥有的子树树称为结点的度

2.度为0的称之为叶结点也是终端结点

3.树的度是树内各结点的度的最大值

结点间的关系

 结点的子树称为该结点的孩子,反正该结点称为孩子的双亲,同一个双亲的孩子称为兄弟或者姐妹,结点的祖先是从根到该结点上所有路径的结点(可千万别以为只有根结点是祖先),反之以某结点为根的子树任意一结点都称为该结点的子孙。

树的其他概念

结点的层次是从根开始的,根为第一层,根的孩子为第二层。双亲在同一层的结点互为堂兄弟,树中结点的最大层次称为树的深度或高度

那么这颗树的深度或者高度就是4

  森林是n课互不相交的树的集合,也就是很多课树在一起,但是他们不相交,上面是子树不能相交,这里分清。

对比线性表与树,他们的结构其实相差很大

1.线性结构

1.第一个数据元素:无前驱

2.最后一个元素:无后继

3.中间元素一个前驱,一个后继

2.树结构 

1.根节点:无双亲,唯一

2.叶节点:无孩子,可以多个

3.中间结点:一个双亲多个孩子

树的存储结构 

1.双亲表示法

 除了根结点外,其余结点可以没有孩子,但肯定有双亲,那么我们可以用一片连续的空间存储树的结点,在结点中附设一个指示器指明双亲结点在数组的位置。

那根结点的双亲位置我们可以设置为-1,这样就很好解决问题了

/*树的双亲表示法结点结构定义*/
#define MAXSize 100
typedef int TEDataType; 	/* 树结点的数据类型,目前暂定为整型*/
typedef struct PTNode	/*结点结构*/
{
    TEDataType data;	/*结点数据*/
	int parent;	/*双亲位置*/
} PTNode ;

typedef	struct	/*树结构*/
{
	PTNode nodes[MAXSize]; /*结点数组*/
	int r,n;	/*根的位置和结点数*/
} PTree;

 这样的存储结构我们可以很快可以通过parent这个指示器去找到它的双亲结点的位置,但是如果要找孩子我们就需要遍历了,比较麻烦,那我们增加一个孩子的指示器呢,也就是再增加一个孩子的域

如果没有孩子,那我们就 设置为-1,如果有那么就表示第一个孩子,如果有两个孩子,知道第一个,那么第二个也就很清楚了

但是这种结构如果要知道兄弟又要增加,所以到最后可能会有些复杂,这也就意味着系统的空间开销很大

2.孩子表示法

我们可以设置一个一个结点有多个指针域,这些指针用来指向孩子结点,同时用一个位置来存储指针的个数,这样可以避免多余的空间开销

 

 这样所以可以,但是你看这个结构也是非常复杂的,每个结点的结构都有所不同,所以运行起来可能会对时间有所损耗

通过观察结构,我们可以把每个结点都存储到一个顺序结构的数组中,然后再把他们的孩子建立一个单链表,这些个孩子结点的指针又指向结点的另外一个孩子,这样就可串起来

这就是我们的孩子表示法,需要找这个结点或者是兄弟结点直接遍历就行了,但是如果需要找到双亲那么又可能很麻烦

3.左孩子又兄弟表示法

有了上面的认识我们可以用结点的第一个孩子指向它的兄弟结点,这样我们也可以很轻松找出某个结点的位置,但是如果要找双亲那么也会很麻烦,哈哈,但是如果增加一个指针指向双亲那么就可以解决这个问题了

 

它的结构表示就是

typedef int TEDataType;
typedef struct TreeNode
{
	TEDataType data;
	struct TreeNode* Leftchild, * Rightchild;//左孩子和右孩子
}TreeNode;

 由于这种结构的特性可以很快找到该节点的位置,所以在文件目录中通常用这种表示法

比如随便打开一个文件,里面有很多子文件那么这些子文件也就是兄弟关系,他们逐个遍历,最终把把整个目录表示出来

二叉树的概念

二叉树的定义

二叉树是n个结点的有限集合,n=0,称为空树,n>0的时候由一个根节点和两个互不相交的树组成,分别称为根结点的左子树和右子树

左图就不是二叉树,因为D有三棵子树

二叉树的特点

二叉树的有顺序规定的,所以二叉树又有下面几种形态

空二叉树

只有根结点

根节点只有左子树

根结点只有右子树

根结点既有左子树又有右子树

 

如果是三个结点的树,那么只会有树1和后面4棵树中的任意一个,因为不分顺序,而二叉树是分顺序的,所以上图代表了不同的二叉树 

 特殊二叉树
1.斜树

所有结点都只有左子树的二叉树称为左斜树。所有结点都只有右子树的称为右斜树。两者都叫斜树

2.满二叉树

所有分支结点都有左子树和右子树,并且所有的叶子都在一层上面,这样的树叫满二叉树

3.完全二叉树

在编号为i的结点与同样深度的满二叉树中编号为i的结点位置完全相同,称为完全二叉树,

所有满二叉树也是一种特殊的完全二叉树

 

二叉树的性质 

1.在二叉树中第i层至多有2^(i-1)个结点,所有结点也就是每一层的加起来所以是一个等比求和可以得所以结点至多有2^i-1个结点

2.对于任何一颗二叉树,如果叶结点数为n0,度为2的结点数为n2,则n0=n2+1;

  对于这个性质其实很好理解,就是当我们增加一个度为1的结点的时候,会减少一个度为0的结点,同时也会增加一个度为0的结点,所以总体来说度为0的结点是不变的

  如果我们增加的是度为2的结点那么就会减少一个度为1的结点,同时也会增加一个度为0的结点,所以度为0的结点总是比度为2的结点大1的,这是恒成立的

3.具有n个结点的完全二叉树的深度为[log2n]+1

4.对于一颗二叉树,如果按照从上至下从左至右的数组顺序存储对所有结点从0开始编号,对于序号为i来说

如果i=0,无双亲,根节点,如果i>0;则双亲为(i-1)/2;

如果2*i+1<n,则左孩子序列为2*i+1;如果2*i+1>=n则无左孩子

 如果2*i+2<n,则右孩子序列为2*i+2;如果2*i+2>=n则无右孩子

二叉树的存储结构 

 1.顺序存储

顺序存储就是把二叉树存储在数组中,用数组的下表表示孩子和双亲的位置,所有这种表示法一般只是用在了完全二叉树,其他的用起来太浪费空间了,比如斜树就会浪费大量空间

它在物理上是一个数组,但是逻辑上又是一个二叉树,这里不要弄混

2.链式存储

二叉树每个结点最多有两个孩子,所以设置一个数据域和两个指针域,这样的链表也叫二叉链表,这样做比上面的顺序存储更加容易去理解

 

如果需要还可以增加一个双亲指针,这样就变成了三叉链了。

对于树和二叉树的介绍就先到这里,后续的使用和算法会在下篇文章介绍

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电脑卡顿怎么办?教你三招,轻松解决卡顿问题!

在现代社会&#xff0c;电脑已成为我们日常生活和工作中不可或缺的工具。然而&#xff0c;随着使用时间的增长&#xff0c;不少用户可能会遇到电脑卡顿的问题。卡顿不仅影响工作效率&#xff0c;还可能造成数据丢失等严重后果。本文将为大家介绍三种解决电脑卡顿问题的方法&…

使用 CSS 创建响应式图像滑块

使用 CSS 创建响应式图像滑块 效果展示 PC 端效果 移动端 / iPad 效果 CSS 知识点 媒体查询知识点复习position: absolute 的使用复习:nth-child 的使用复习 页面需求及实现思路 需求 页面会根据设备大小形成不同的布局方式当前展示图片放大并且展示对应的标题和描述其他…

智能公交调度管理服务系统

一、 背景 从上世纪末开始&#xff0c;为了缓解经济发展带来的道路交通方面的压力&#xff0c;绝大多数国家的公共交通部门方面进行了大量的投入&#xff0c;都在研发各种先进的技术来改善交通状况&#xff0c;其中包括了对公交 车的定位、对车辆实施全方位的虽然有的监控、自…

Leo赠书活动-23期 【Python数据分析】文末送书

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 赠书活动专栏 ✨特色专栏&#xff1a;…

告别繁琐代码,只需简单拖拽,便可从0到1开发!

告别繁琐代码&#xff0c;拥抱科技未来&#xff01;只需简单拖拽&#xff0c;便可从0到1开发&#xff01;代码即刻生成&#xff0c;一键下载&#xff0c;轻松上手。我们的低代码平台&#xff0c;不仅高效便捷&#xff0c;更完全开源&#xff0c;让你自由探索编程的无限可能&…

Vue3性能优化之自定义指令实现图片懒加载

图片懒加载是一种常见性能优化的方式&#xff0c;进入网址时不全部加载图片 当用户进入图片可视区域时加载 不仅大大减少了服务器的压力 也可以时首屏时间变短 图片懒加载的实现原理&#xff1a;在图片没进入可视区域的时候&#xff0c;只需要让 img 标签的 src 属性指向一张…

发票是扫码验真好,还是OCR后进行验真好?

随着科技的进步&#xff0c;电子发票的普及使得发票的验真方式也在不断演进。目前&#xff0c;我们常见的发票验真方式主要有两种&#xff1a;一种是扫描发票上的二维码进行验真&#xff0c;另一种是通过OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别…

Python爬虫实战之爬取微博热搜

前言 在开始之前&#xff0c;我们需要了解一些基本的爬虫知识。Python爬虫是一种自动化获取网页内容的技术&#xff0c;可以模拟浏览器行为&#xff0c;获取网页源代码&#xff0c;并从中提取所需的信息。在爬取微博热搜榜单时&#xff0c;我们需要发送HTTP请求获取网页源代码…

263:vue+openlayers 高德地图坐标转换 WGS84-GCJ02

第263个 点击查看专栏目录 本示例演示如何在vue+openlayers中将 WGS84坐标转化为GCJ02坐标,从而使得高德地图能正确的显示物体的坐标点。 84坐标系可以理解为是真实坐标系,是一个地点的实际坐标值。02坐标系是加密后的坐标系,是为了国家安全考虑。对应的不是实际的坐标值,…

C语言键盘输入与屏幕输出——数据的格式化键盘输入

目录 数据的格式化键盘输入 输入数据的格式控制 scanf&#xff08;&#xff09;的格式字符 scanf()的格式修饰符 数据的格式化键盘输入 格式 scanf&#xff08;格式控制字符串&#xff0c;输入地址表&#xff09;&#xff1b; 输入数据的格式控制 格式 scanf&#xff08;…

500万美元!谷歌设超级大奖推动量子计算实用化

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 编辑丨王珩 编译/排版丨浪味仙 沛贤 深度好文&#xff1a;1500字丨10分钟阅读 近日&#xff0c;谷歌联合 XPRIZE基金会&#xff0c;发起一项价值 500 万美元、为期 3 年的全球量子应用竞赛&am…

python---基础(一)

文章目录 前言1.对象的基本组成2.变量和常量2.1.变量的声明2.2.常量_链式赋值_系列解包赋值2.2.1.常量是不是真的常量&#xff1f;2.2.2.链式赋值2.2.3.系列解包赋值 3.内置数据类型_基本算数运算符3.1四种内置数据类型3.2.基本运算符3.3.divmod() 前言 这几年&#xff0c;随着…

如何处理Jenkins打包npm install没有拉取到最新依赖的问题

问题背景&#xff1a; 我们项目中有私有依赖包 frame&#xff0c;是私有服务器上通过 npm 去管理。frame包 publish 之后&#xff0c;通过Jenkins打包时&#xff0c;npm install 一直没有拉取最新的代码。 思考&#xff1a;通过在本地直接替换 node_modules 里的 frame 包&…

文心一言 VS 讯飞星火 VS chatgpt (227)-- 算法导论16.3 9题

九、证明&#xff1a;对于一个由随机生成的8位字符组成的文件&#xff0c;没有任何压缩方法可以望将其压缩、哪怕只是压缩一位。(提示&#xff1a;比较可能的文件数量和可能的编码文件数量。) 文心一言&#xff1a; 确实&#xff0c;对于一个由随机生成的8位字符组成的文件&a…

卷积神经网络(CNN)的数学原理解析

文章目录 前言 1、介绍 2、数字图像的数据结构 3、卷积 4、Valid 和 Same 卷积 5、步幅卷积 6、过渡到三维 7、卷积层 8、连接剪枝和参数共享 9、卷积反向传播 10、池化层 11、池化层反向传播 前言 本篇主要分享卷积神经网络&#xff08;CNN&#xff09;的数学原理解析&#xf…

C++--内联函数

当调用一个函数时&#xff0c;程序就会跳转到该函数&#xff0c;函数执行完毕后&#xff0c;程序又返回到原来调用该函数的位置的下一句。 函数的调用也需要花时间&#xff0c;C中对于功能简单、规模小、使用频繁的函数&#xff0c;可以将其设置为内联函数。 内联函数&#xff…

中视频双去重,一键多平台,可达日入2000+

【核心】将不可复制的飞书文档&#xff0c;用大模型二创&#xff0c;进而生成思维导图&#xff08;视频&#xff09;&#xff0c;以下全过程使用工具半自动完成。 【飞书】https://puojikpj98.feishu.cn/docx/KUNad8Y0UoFHEexMyAfc7sA1nQf 【文案】 中视频双去重与多平台发布项…

Java中的static关键字

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

C语言数据结构易错知识点(6)(快速排序、归并排序、计数排序)

快速排序属于交换排序&#xff0c;交换排序还有冒泡排序&#xff0c;这个太简单了&#xff0c;这里就不再讲解。 归并排序和快速排序都是采用分治法实现的排序&#xff0c;理解它们对分支思想的感悟会更深。 计数排序属于非比较排序&#xff0c;在数据集中的情况下可以考虑使…