树的结构在逻辑结构上已经不再是像链表、栈和队列一样是一对一的线性结构了,而是一对多的逻辑结构。在这里,我们利用顺序存储和链式存储的特点,实现对树的存储结构的表示。有三种不同的方法:双亲表示法、孩子表示法、孩子兄弟表示法。

使用顺序存储来存储树,将树存储在数组中。这里首先介绍双亲表示法。

在树的结构中,除了根节点外,其他节点必定有双亲节点。在这里我们假设以一组连续内存空间也就是数组来存储树的节点。同时,为了构造完整的树结构,在每个节点中附设一个指示器指示其双亲节点在连续内存空间中的位置。也就是说,每个节点除了存储自己的数据元素外,还要知道它的双亲节点在哪里。那么树的节点结构如图所示

那么将这样的节点存储在连续内存空间中,形成的存储结构和逻辑关系可由下图表示

显然,树的顺序存储结构中,每个节点都是一个结构体。结构体由两部分组成,一部分树数据域data,一部分是指针域,存储的是该节点的双亲节点在数组中的下标。同时,在数结构中,根节点是没有双亲节点的,所以将表示双亲节点的结构体中的指针设置为-1。其代码所示为

1 struct PINode
2 {
3    //data为存储数据区域,可以根据自己需要而修改
4     int data;
5    //parent中存储的是该节点的都节点在数组中的下标
6     int parent;  
7 }

我们只要知道树的根节点,我们就能知道整个树的所有节点。所以我们要知道树的根节点再连续内存空间的位置。同时,我们还要知道这个树中共有多少个节点。所以,我们需要另外再形成一个结构体。

struct PTree
{
    //为数组分配连续内存空间,每个数据元素都是节点
    PTNode nodes[MAX_TREE_SIZE];
    //记录根节点在数组中的位置和树中共有多少个节点。
    int r,n;
}
原文地址:https://www.cnblogs.com/hxhlrq/p/12684418.html