数据结构---树的存储结构
树的存储结构
双亲表示法
一组连续的存储单元(数组)存储树的结点,每个结点除了数据域data外,还附设一个parent域用以指示其双亲结点的位置
特点:找双亲容易,找孩子难
双亲直接访问parent域就可获得,但是要找孩子就得遍历整个结构
类型描述
typddef struct PTNode
{
TElemType data;
int parent;
}PTNode;
树结构
#define MAX_TREE_SIZE 100
typedef struct
{
PTNode nodes[MAX_TREE_SIZE];
int r,n;//根结点的位置和结点的个数
}PTree;
孩子表示法
把每个结点的孩子结点排列起来,看成是一个线性表,且以单链表做存储结构,则n个结点有n个孩子链表(叶子的孩子链表为空表)。而n个头指针又组成一个线性表,为了便于查找,可采用顺序存储结构(数组)。
这种方式结合了单链表和数组两种存储结构
特点:在没有开辟一个新空间存储双亲时,找孩子容易,找双亲难
类型描述
typedef struct CTNode
{
int child;
struct CTNode *next;
}*Childptr;
typedef struct
{
TElemType data;
childPtr firstchild;//孩子链表头指针
}CTBox;
树结构
typedef struct
{
CTBox nodes [MAX_TREE_SIZE];
int n,r;//结点数和根结点的位置
}CTree;
孩子兄弟法
以二叉链表做树的存储结构。链表中结点的两个链域分别指向该结点的第一个孩子结点和下一个兄弟结点,分别命名为 firstchild域和 nextsibling域
特点:孩子容易找,为每一个结点开辟了parent域双亲也可以找,顺着孩子指针找到孩子结点,然后顺着孩子结点的nextsibling 域可以找到所有孩子。
优点:它和二叉树的二叉链表表示完全一样, 便千将一般的树结构转换为二叉树进行处理, 利用二叉树的算法来实现对树的操作
类型描述
typedef struct CSNod
e{
ElemType data;
struct CSNode *firstchild, *ne·xtsibling;
) CSNode,*CSTree;