4.2树的存储结构
顺序存储结构:
双亲表示法:用一组连续的存储空间存储树的结点,同时在每个结点中,用一个变量存储该结点的双亲结点在数组中的位置。(孩子少的时候)
结构:
typedef char ElemType;
typedef struct TNode{
ElemType data; //结点数据
int parent; //该结点双亲在数组中的下标
}TNode; //结点数据类型
#define Maxsize 100
typedef struct{
TNode nodes[MaxSize]; //结点数组
int n; //节点数量
}Tree;
实例:
双亲表示法可以根据parent值找到该结点的双亲结点,时间复杂度为O(1)。
链式存储:
孩子表示法:把每个结点的孩子结点排列起来存储成一个单链表。所以n个结点就有n个链表;如果是叶子结点,那这个结点的孩子单链表就是空的;然后n个单链表的头指针又存储在一个顺序表(数组)中。
结构
typedef char ElemType;
typedef struct CNode{
it child; //该孩子在表头数组的下标
struct CNode*next; //指向该结点的下一个孩子
} CNode,*Child; //孩子结点数据类型
typedef struct{
ElemType data; //结点数据域
Child firstchild; //指向该结点的第一个孩子结点
}TNode; //孩子结点数据结构类型
邻接表:
#define Maxszie 100
typedef struct{
TNode nodes[Maxsize]; //结点数据域
int n; //树中结点个数
}Tree; //树的孩子表示结构
孩子兄弟表示法:存储孩子结点和兄弟结点,具体来说,就是要设置两个指针,分别指向该结点的第一个孩子结点和该结点的兄弟结点。
typedef char ElemType;
typedef struct CSNode{
ElemType data;
struct CSNode*firstchild,*rightsib;
}CSNode;