概念:
森林是m棵互不相交的树的集合
树储存方法:
1双亲表示法
实现:定义结构数组储存树的结点,结点有数据域和双亲域,双亲域储存双亲结点在数组中的位置
特点:找双亲容易,找孩子难
代码展示:
typedef struct PTNode/*定义结点*/
{
int data;
int parent;
}PTNode;
typedef struct
{
PTNode node[MAXSIZE];
int r, n;/*根结点位置和结点个数*/
}PTree;
2孩子链表法(顺序表加链表表示)
实现:把每个结点储存在一个数组中,每个结点的孩子结点位置以链表形式接在该结点之后
图像展现:
特点:找孩子容易,找双亲难
代码展示:
typedef struct CTNode/*孩子结点结构*/
{
int child;
struct CTNode* next;
}ChildPtr;
typedef struct/*双亲结点结构*/
{
int data;
ChildPtr firstchild;
}CTBox;
typedef struct
{
int r, n;
CTBox nodes[MAXSIZE];
}CTree;
3孩子兄弟表示法
实现:利用二叉链表,每个结点的两个指针域分别指向其第一个孩子结点和下一个兄弟结点
图像展现:
特点:空间效率较低,找双亲难
代码展示:
typedef struct CSNode
{
int data;
struct CSNode* firstchild, * nextboy;
}CSNode,*CSTree;
总结:
森林简单来说就是树的集合。树的储存方法多种多样,应根据利用数据的频繁程度来选择合适的储存方式,如访问结点孩子较频繁,且数据量大的系统,使用孩子链表法比另外两种方法更好;访问结点双亲较频繁,且数据量大的系统,使用双亲表示法比另外两种方法更好;