1.树的存储结构
1.1双亲表示法
除了根节点外,其余每个节点不一定有孩子,但一定有双亲;
以一组连续的数据存储空间来存储树的节点,同时在每个节点里,附带一个指示器来指向其双亲结点:
data+parent
data是数据域,存储结点的数据;parent为指针域,指向该结点双亲在数组中的下标;
const MAX_TREE_SIZE = 100;
using TElemType = int ; //结点的数据类型
//节点结构
struct PTnode{
TELemTpye data; //结点数据
int parent; //双亲位置
} PTnode;
struct {
PTNode nodes[MAX_TREE_SIZE];
int r,n;//根节点的位置,结点的个数
}PTree;
由于根节点是没有双亲的,因此把根节点的(双亲的)位置域设置为-1;找到双亲的时间复杂度为O(1);
寻找结点的孩子:data+parent+firstchild;(没有孩子的结点firstchild设为-1)
兄弟关系: data+parent+rightsib;右兄弟不存在,则rightsib设为-1;
1.2孩子表示法
多重链表法:每个结点有多个指针域,其中每个结点指向一棵子树的根节点
1.将每个结点的孩子结点排列起来。以单链表的形式储存,如果是叶子节点则为空;
2.将头指针组成线性表,采用顺序存储结构,存放进一个一维数组;
孩子链表:child + next ;child:存储某个结点在表头数组中的下标;Next:指向某结点的下一个孩子结点;
表头结点:data + firstchild ;data:存储某结点的数据信息;firstchild:存储该结点的孩子链表的头结点;
const MAX_TREE_SIZE =100;
struct CTNode {
int child;
CTNode *next;
}*ChildPtr;
struct CTBox{
TElemType data;
ChildPtr firstchild;
};
struct CTree{
CTBox nodes[MAX_TREE_SIZE];
int r,n;
}
双亲孩子表示法:
1.3孩子兄弟表示法
data+firstchild+rightsib
data:数据
firstchild:存储该结点的一个孩子结点的存储地址;
rightsib:存储该结点的右兄弟的存储地址;