树的三种表示法:双亲表示法、孩子表示法、孩子兄弟表示法

您所在的位置:网站首页 时间复杂度有几种表现形式和特点 树的三种表示法:双亲表示法、孩子表示法、孩子兄弟表示法

树的三种表示法:双亲表示法、孩子表示法、孩子兄弟表示法

2024-07-02 13:27:14| 来源: 网络整理| 查看: 265

抽象数据类型:

在这里插入图片描述

树的存储结构:

利用顺序存储和链式存储的特点,完全可以实现对树的存储结构的表示。介绍三种不同的表示法:双亲表示法、孩子表示法、孩子兄弟表示法。

1.双亲表示法

我们假设以一段连续空间存储树的结点,同时在每个结点中,附设一个指示器指示其双亲结点到链表中的位置。也就是说,每个结点除了直到自己是谁外,还要直到自己的双亲在哪里。如图: 在这里插入图片描述

其中data就是数据域,存储结点的信息。而parent是指针域,存储该结点的双亲在数组中的下标。 双亲表示法的结点结构定义代码:

//树的双亲表示法结点结构定义 #define MAX_TREE_SIZE 100 typedef int TElemType; //树结点的数据类型,目前暂定整形 typedef struct PTNode{ //结点结构 TElemType data; //结点数据域 int parent; //双亲位置 }PTNode; typedef struct{ //树结构 PTNode nodes[MAX_TREE_SIZE]; //结点数组 int r,n; //根节点的位置和结点数 }

有了这样的结构定义,我们就可以实现双亲定义法了。由于跟结点没有双亲,所以我们约定根结点的位置域设置为-1,这就意味着,我们所有结点都直到他双亲的位置。如图的树结构和双亲表示法的图表。 在这里插入图片描述

在这里插入图片描述

我们可以通过上面快速的找到结点的双亲。但是我们要知道结点的孩子怎么办?那就只有遍历整个结构了。 我们能否改进一下?当然可以,我们可以给结点增加孩子域。

2.孩子表示法

换一种完全不同的想法。由于树中每个结点可能有很多的子树,可以考虑用多重链表,即每一个结点有多个指针域,其中每个指针指向一个子树的根节点,我们把这种方法叫做多重链表表示法。不过,树的每个结点的度,也就是它孩子个数是不同的。所以可以设计两种方案来解决。

方案一

指针域的个数等于树的度。(树的度是树各个结点度的最大值)。(结点拥有的子树称为结点的度)。 在这里插入图片描述

如图,data就是数据域,child1····是指针域,用来指向该结点的孩子结点。

就像6-4-1的树一样,我们用这个方法来实现。如图。 在这里插入图片描述 我们可以看到。^这个符号就是代表当前这个指针域并没有用到。这样如果树的各结点的度差距过大的话,显然非常浪费空间。那我们为什么不按需分配空间呢?这样就有第二种方案了

方案二

每个结点指针域的个数等于该结点的度,我们专门来取一个位置来存储结点指针域的个数。如图。 在这里插入图片描述

如图,data就是数据域。degree是度域,也就是存在该结点的孩子结点数。child1····是指针域,用来指向该结点的孩子结点。

那么对应的树图就应该是这样。 在这里插入图片描述 显然,方案二克服了浪费空间的缺点,但是由于各个结点的链表结构是不相同的,在加上要维护结点的度的数值,在运算上显然有损耗。 能否有更好的方法?既可以减少浪费,又能使结点结构相同。 我们把每一个结点放入顺序存储结构中是合理的,但是每个结点的孩子多少是不确定的,所以我们再对每个结点的孩子建立一个单链表来体现他们的关系。 这就是我们的孩子表示法。 具体办法:把每个结点的孩子排列起来,以单链表作存储结构,则n个结点有n个孩子链表,如果是叶子结点则此单链表为空。然后n个头指针有组成一个线性表,采用顺序存储结构,存进一个一维数组。如图。 在这里插入图片描述 为此,设计两种结构,一个是孩子链表的孩子结点,如图。 在这里插入图片描述

child是数据域,存储某个结点在表头数组中的下标。next是指针域,用来存储某结点的下一孩子结点的指针。

另一个是表头数组的表头结点。如图。 在这里插入图片描述

data是数据域,存储某结点的数据信息。firstchild是头指针域,存储该节点的孩子链表的头指针。

以下是孩子表示法的结构定义代码。

//树的孩子表示法结点结构定义 #define MAX_TREE_SIZE 100 typedef int TElemType; //树结点的数据类型,目前暂定整形 typedef struct CTNode{ //孩子结点 int child; struct CTNode * next; }*ChildPtr; typedef struct{ //表头结构 TElemType data; ChildPtr firstchild; }CTBox; typedef struct{ //树结构 CTBox nodes[MAX_TREE_SIZE]; //结点数组 int r,n; //根节点的位置和结点数 }

我们可以改进一下。把双亲表示法和孩子表示法综合一下,加一个双亲域。如图。(双亲孩子表示法) 在这里插入图片描述

3.孩子兄弟表示法

任何一棵树,它的结点的第一个孩子如果是唯一的,它的右兄弟如果存在也是唯一的,因此,我们设置两个指针,分别指向该结点的第一个孩子和此结点的右兄弟。 结点结构如图。 在这里插入图片描述

data是数据域,firstchild为指针域,存储第一个孩子结点的地址,rightsib是指针域,存储该结点的右兄弟的地址。

结构定义代码如下.

//树的孩子兄弟表示法结构定义 typedef struct CSNode{ TElemType data; struct CSNode *firstchild,*rightsib; }CSNode,*CSTree;

对于6-4-1的树来说,这种方法实现的示意图如图。 在这里插入图片描述 这种方法给查找某结点的某个孩子带来了方便,只需要通过firstchild 找到此结点的左儿子,然后再通过左儿子找到二弟,一直下去,知道找到具体的孩子。当然,如果想要找到双亲,完全可以增加一个parent 指针域来解决。

参考: 大话数据结构/程杰 著.—北京:清华大学出版社,2011.6



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭