5.5.1树的存储结构
树的存储结构通常采用如下三种表示方式。
1.双亲表示法
这种存储结构求指定结点的双亲(或祖先包括根)都是十分方便的。
但是在这种存储表示法中,求指定结点的孩子或其他后代则可能需要遍历整个结构。
2.孩子链表法
与双亲表示法相反,孩子链表表示法便于那些涉及孩子结点的操作的实现,而不适用操作Parent(T,x)。
带双亲的孩子链表
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 #define MaxTreeSize 100 5 typedef char DataType; 6 7 struct cnode//孩子链表结点类型 8 { 9 int child;//孩子结点在指针数组中的序号 10 struct cnode *next; 11 }; 12 typedef struct cnode CNode; 13 14 struct panode 15 { 16 DataType data;//树中结点数据域 17 int parent;//双亲位置域 18 CNode *firstchild;//孩子结点头指针 19 }; 20 typedef struct panode PANode;//指针数组结点类型 21 22 struct ctree 23 { 24 PANode nodes[MaxTreeSize];//指针数组 25 int n, r;//n为结点数,r为根结点在指针数组中的位置(即下标) 26 }; 27 typedef struct ctree CTree; 28 29 void main() 30 { 31 32 }
3.孩子兄弟表示法
这种存储结构的最大优点是,它和二叉树的二叉链表表示完全一样,因此可利用二叉树的各种算法来实现对树的操作。
5.5.2树、森林与二叉树的转换
树、森林到二叉树的转换
我们知道,树中每个结点至多只有一个最左边的孩子(长子)和一个右邻的兄弟,按照这种关系,只要按下面的方法即可将一棵树转换成二叉树:首先在所有兄弟结点之间加一道连线,然后再对每个结点保留长子的连线,去掉该结点与其他孩子的连线。由于树根没有兄弟,所以转换后的二叉树,其根结点的右子树必为空。
将一个森林转换为二叉树的方法是:先将森林中的每棵树转化成二叉树,然后再将各二叉树的根结点看作是兄弟连在一起,形成一棵
二叉树。