14.0、C语言数据结构——树 (2)
双亲表示法:
言外之意就是以双亲作为索引的关键词的一种存储方式;
我们假设以一组连续空间存储树的结点,同时在每个结点中,附设一个指示其双亲结点在数组中的位置的元素;
来看看代码实现过程->
#define MAX_TREE_SIZE 100
typedef int ElemType;
type struct PTNode {
ElemType data; //结点数据
int parent; //双亲位置
}PTNode;
typedef struct {
PTNode nodes[MAX_TREE_SIZE];
int r; //根的位置
int n; //结点数目
}PTree;
这样的存储结构,我们可以根据某结点的 parent 指针找到他的双亲结点,所用的时间复杂度是O(1),索引到parent的值为-1时,表示找到了树结点的根;
存储结构的设计是一个非常灵活的过程,只要你愿意,你可以设计出任何你想要的奇葩存储结构~
一个存储结构设计的是否合理,取决于基于该存储结构的运算是否合适、是否方便,时间复杂度好不好等等。
孩子表示法:
我们这次换个角度来考虑,由于树中每个结点可能有多棵子树,可以考虑用多重链表来实现;
方案1 ->
根据树的度(一棵树的度按照最多的子结点数来算),声明足够空间存放子树指针的结点:
缺点十分明显,就是造成了浪费;
那么针对方案1 的缺点我们制定了第二套方案->

这样我们就克服了浪费这个缺点,但是每个结点的度的值不同,初始化和维护起来难度巨大,还是不可取;
为了同时解决上面两种方案的缺点,请看方案3,如下所示->
进过层层优化 得出既可以找到双亲又可以找到孩子的 -> 双亲孩子表示法

接下来用代码实现一下->
#define MAX_TREE_SIZE 100
typedef char ElemType;
//孩子结点
typedef struct CTNode {
int child; //孩子结点的下标
struct CTNode* next; //指向下一个孩子结点的指针
} *ChlidPtr;
//表头结构
typedef struct {
ElemType data; //存放在树中的结点的数据
int parent; //存放双亲的下标
ChildPtr firstchild; //指向第一个孩子的指针
} CTBox;
//树结构
typedef struct Tree{
CTBox nodex[MAX_TREE_SIZE]; //结点数组
int r; //根结点的位置
int n; //结点数量
}Tree;

1万+

被折叠的 条评论
为什么被折叠?



