一、双亲表示法
结构:
- 存储节点数据
- 存储双亲位置
typedef int ElemType;
typedef 100 MAX_TREE_SIZE;
struct PTNode /*节点结构*/
{
ElemType data;
int parent;
}
struct PTree /*树结构*/
{
PTNode nodes[MAX_TREE_SIZE];
int r, n;/*根的位置和节点数*/
}
在树的双亲表示法中,PTree结构包含了一个PTNode数组,在这个PTNode数组中,就包含了这棵树的所有节点信息,即如下图所示:
如上图所示,PTree数组的每个元素都是PTNode类型,也就是树的一个节点,而每个节点包含两个信息,即 data 和 parent,上图中第一个PTNode的parent是第4个PTNode,如此表示。
二、孩子表示法
与双亲表示法类似,用一个数组存储所有节点,但每个节点都指向一个链表,链表中的每个元素都是这个节点的孩子。
在这种表示方法下,每个节点都出现了两次,比如节点4,如果它是节点0的第一个孩子,那么它就既出现在数组的第4的位置,又出现在节点0指向的链表的第一个位置。
结构体表示如下:
struct ChildPtr //用来构成链表的元素
{
int child_where;/*孩子所在的位置*/
ChildPtr *next;
}
struct CTBos //用来构成数组中的元素
{
ElemType data;
ChildPtr *FirstChild; //指向表示它孩子的链表的头指针
}
struct CTree
{
CTBox nodes[MAX_TREE_SIZE]; //数组,存储了每个节点
int r, n; /*根的位置和结点数*/
}
三、孩子兄弟表示法
一个节点,既包含这个节点的数据,又包含它的第一个孩子,又包含它右侧紧邻的兄弟。如下图所示: