树的三种表示法:双亲表示法、孩子表示法、孩子兄弟表示法 |
您所在的位置:网站首页 › 时间复杂度有几种表现形式和特点 › 树的三种表示法:双亲表示法、孩子表示法、孩子兄弟表示法 |
抽象数据类型:
利用顺序存储和链式存储的特点,完全可以实现对树的存储结构的表示。介绍三种不同的表示法:双亲表示法、孩子表示法、孩子兄弟表示法。 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····是指针域,用来指向该结点的孩子结点。 那么对应的树图就应该是这样。 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; //根节点的位置和结点数 }我们可以改进一下。把双亲表示法和孩子表示法综合一下,加一个双亲域。如图。(双亲孩子表示法) 任何一棵树,它的结点的第一个孩子如果是唯一的,它的右兄弟如果存在也是唯一的,因此,我们设置两个指针,分别指向该结点的第一个孩子和此结点的右兄弟。 结点结构如图。 data是数据域,firstchild为指针域,存储第一个孩子结点的地址,rightsib是指针域,存储该结点的右兄弟的地址。 结构定义代码如下. //树的孩子兄弟表示法结构定义 typedef struct CSNode{ TElemType data; struct CSNode *firstchild,*rightsib; }CSNode,*CSTree;对于6-4-1的树来说,这种方法实现的示意图如图。 参考: 大话数据结构/程杰 著.—北京:清华大学出版社,2011.6 |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |