树的逻辑结构、树的存储结构

本文详细介绍了树的数据结构,包括树的定义、性质以及非空树的特征。探讨了树的不同存储方法,如双亲表示法、孩子链表表示法和孩子兄弟表示法,分析了各种方法的优缺点,并提供了优化思路。内容涵盖了树的双亲孩子表示法和孩子兄弟表示法,强调了快速查找双亲和孩子结点的重要性。
摘要由CSDN通过智能技术生成

本文部分图片截取自B站懒猫老师。
视频链接为:https://www.bilibili.com/video/BV1o541147mS?spm_id_from=333.999.0.0.

树的定义

树:n个结点的有限集合。当 n = 0 时,称为空树。
任意一颗非空树满足以下条件:
(1)有且仅有一个特定的称为的结点。
在这里插入图片描述
判断下图中是否是树的结构。
在这里插入图片描述
在这里插入图片描述
计算机磁盘存储。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
A-B-E-L 经过三条边,所以路径长度就是 3.
在这里插入图片描述
从 A-B-E-L 这条路径来看,A是B、E、L的祖先,B、E、L是A的子孙.
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
数据结构中一般讨论的都是有序数。
在这里插入图片描述
如果把上图中的根节点 A 给去掉,它的三颗子树就变成了森林。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

树的存储结构

在这里插入图片描述

方法一:双亲表示法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
通过查找该数组元素(结点)的parent的值,来确定该结点的双亲结点。不需要用到循环,所以花费时间很少。
在这里插入图片描述
通过循环来遍历每个结点的parent的值,然后将该值与数组下标(结点所对应的层数)进行比较,从而来确定孩子结点。时间会慢一些。

如何让查找孩子结点变的快捷呢?

我们可以在结构体中增加一个字段,比如下图所示。
在这里插入图片描述
firstChild表示第一个孩子结点。
这里只记录了一个孩子,那如果想获知其他孩子结点怎么办呢?
这就要涉及到如何去查找兄弟结点了。
在这里插入图片描述
我们还可以在结构体中增加一个字段用来表示兄弟结点的信息,比如下图。
在这里插入图片描述
其中,rightSib的意思是右同胞的意思。

通过增加rightSight字段,我们可以发现是可以将这颗树的信息给描述出来的。其中,当发现rightSib中的值为-1时,就表示没有右边没有兄弟结点了。相当于链表中的空指针用来表示链表的结束的概念。

方法二:孩子链表表示法

在这里插入图片描述
回顾下,
在这里插入图片描述
在这里插入图片描述
优点:直观
缺点:浪费存储空间

在这里插入图片描述
增加了一个度域,用来存放该结点的度。
在这里插入图片描述
优点:直观
缺点:结点结构不一致,会给编码带来不便。因为不同结点结构要定义不同的表示该结点的结构体类型

所以说这种方案也不好,来看看第三种方案。
在这里插入图片描述
需要定义两种结构体
在这里插入图片描述
在这里插入图片描述
从上图中可以看到,(表头结点的)第一栏包含基本数据信息,第二栏则包含一个指针域。

采用上述方法,
在这里插入图片描述
通过每个结点(表头结点)的指针域可以很方便的找到孩子结点。
在这里插入图片描述
假设这里寻找结点I的双亲结点,需要怎么做呢?
已知I的结点下标为8,我们就需要通过遍历每个结点的指针域,直到找到指针域所指向的孩子结点中值为8的结点。

这种通过遍历的方式,时间性能还是相对来说比较慢了,那如果我们要求快一点呢?那应该如何对上述结构再进一步优化呢?
在这里插入图片描述
增加一列来存储当前结点的双亲结点的下标。

通过这种方式,我们发现可以快速的找到双亲结点和孩子结点,因此,我们就把这种方式称为双亲孩子表示法。

方法二:孩子兄弟表示法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
沿着指针指向很容易就可以找到当前结点的兄弟结点。
在这里插入图片描述
假设这里寻找结点B的孩子结点,需要怎么做呢?

我们首先找到结点B的 firstChild 指针域找到它的第一个孩子结点,然后再通过第一个孩子结点的 rightSib 指针域找到其他孩子结点,也是非常方便的。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xuechanba

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值