5.5树和森林

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树、森林与二叉树的转换

树、森林到二叉树的转换

我们知道,树中每个结点至多只有一个最左边的孩子(长子)和一个右邻的兄弟,按照这种关系,只要按下面的方法即可将一棵树转换成二叉树:首先在所有兄弟结点之间加一道连线,然后再对每个结点保留长子的连线,去掉该结点与其他孩子的连线。由于树根没有兄弟,所以转换后的二叉树,其根结点的右子树必为空。

将一个森林转换为二叉树的方法是:先将森林中的每棵树转化成二叉树,然后再将各二叉树的根结点看作是兄弟连在一起,形成一棵

二叉树。

原文地址:https://www.cnblogs.com/denggelin/p/5700255.html