数据结构——树

1.介绍

树就跟大自然的树类似,从根结点开始逐级分支。

如果一个树没有结点,称为空树。相反,如果有结点,就称为非空树

我们用来保存树的元素的结构称为结点

每个树只能有一个根结点,向下连接两个结点的线叫

只有后继的结点是根节点。只有前驱的结点称为叶子节点(或者说终端结点),有后继的称为分支结点(或者说非终端结点)

每个结点即以下结点单独拿出又可以称为一棵树。

该节点的所有前驱结点都是它的祖先结点

该节点的所有后继结点都是它的子孙结点

双亲结点(或者说父节点)是该节点的直接前驱结点。

孩子结点是该节点的直接后继结点。

同个父节点的孩子结点之间称为兄弟结点

堂兄弟结点就是它们的父节点的父节点相同,但父节点不同。

结合现实来说,就是和你同姓的兄弟叫堂兄弟。

结点的层次深度)从根那一层向下数,有的是从0开始,有的从1开始,大多都是从1开始。

结点的高度是从下往上数。

树的高度或者深度就是树的层数。

结点的度就是其孩子结点(或者说分支)的个数。

树的度就是各结点度最大值。

树有有序树无序树之分。但具体运用时,要具体问题具体分析。

比如族谱一般都是按辈分左右有序排列,不能二弟名字排在大哥左边。

又比如说中国分为多少个省,省又分为多少个市,其实这些省之间前后排序是没必要的,市同理。

最后,还有森林,森林就是多个树组成的集合。如果森林没有树,也有空森林的说法。 

2.性质

(1)结点数=总度数+1

我们知道一颗树,只有根节点没有直接前驱,因此上式成立。

(2)度为m的树m叉树

度为m的树表示其中必须有一个结点,它的度为m。

而m叉树表示其某个结点最多有m个分支,那么其实只要小于等于就可以,不一定某个结点度必须为m。

比如一个空树,我们可以说它是m叉树(\forallm≥1)。

(3)高度为h的m叉树最多有m^{h}-1)/(m-1个结点。

3.顺序存储结构

1.双亲表示法

结点包括数据域存放数据,指针域指向双亲所在位序。

结点一般是按层序存储,与上面讲的二叉树不同,例如:

2.带右兄弟的双亲表示法

结点结构仅仅是在双亲表示法中结点结构加了一个右兄弟的指针域,指向右兄弟的位序。

结点一般也是按层序存储。例如:

2.链式存储结构

1.多重链表表示法

每个结点包括一个数据域和多个指针域,每个指针域指向该结点的一个孩子结点。

针对结点的度不同,有以下两种方案。

方案一:指针域的个数等于结点的度

这样树的结构:

在这里插入图片描述

这样,精确的分配了结点的内存空间,不易浪费。但各个结点结构不同,而且要修改该结点度时,会带来一定的时间损耗。

方案二:指针域的个数等于树的度

 这样树的结构:

在这里插入图片描述

 这样,各个结点度相同。虽然使用多了一点限制,比如在使用中,结点的度不能超过树的度,而且也带来了一定的空间浪费,但换来了时间上的快捷。

2.孩子链表表示法

结点结构如下,孩子结点存放该结点信息,指针域指向存放孩子位序的结点。表头结点后面可以增加存放该结点其他孩子位序的指针。

这样,树的结构:

 

 这样,查找一个结点的孩子是非常方便,但不利于查找双亲结点。

为此,有双亲孩子表示法。

3.双亲孩子链表表示法

在上面的孩子结点增加一个单位存储空间存储双亲结点的指针。

我们又想孩子,又想兄弟,有兄弟孩子链表表示法。

4.兄弟孩子链表表示法

 结点结构如下,每个结点存放第一个孩子的指针和右兄弟的指针。

 这样,树的结构:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值