双亲表示法
实现:定义结构数组,存放树的结点,每个结点含两个域
- 数据域:存放结点本身的信息
- 双亲域:提示本结点的双亲结点在数组中的位置
实际上就是顺序存储各个节点的同时,给各节点附加一个记录其父节点位置的变量; 此种方法找双亲容易,找孩子难。
双亲表示法表示普通树的代码:
结点结构:
typedef struct PTNode{
TelemType data;
int parent;//双亲位置域
}PTNode;
树结构:
typedef struct{
PTNode nodes[MAXSIZE];
int r,n;//根结点的位置和结点个数
}PTree;
孩子链表
孩子表示法存储普通树采用的是 "顺序表+链表" 的组合结构,把每个结点的孩子结点排列起来,看成是一个线性表,用单链表存起来,则个结点有n个孩子链表(叶子的孩子链表为空表)。而n个头指针又组成了一个线性表(含n个元素的结构素组)储存
代码实现:
孩子结点结构:
typedef strut CTNode{
int child;
struct CTNode *next;
}*ChildPtr;
双亲结点结构:
typedef struct{
TElemType data;
ChildPtr firstchild;//孩子结点头指针
}CTBox;
树结构:
typedef struct{
CTBox nodes[MAXSIZE];
int r,n;//根结点的位置和结点个数
}CTree;
这种储存结构找孩子容易,找双亲难,为了方便找双亲,可以在数组中加上双亲在数组的位置 成为带双亲的孩子链表
孩子兄弟表示法(二叉链表表示法)
实现:用二叉链表作为树的储存结构,链表中的每个结点的两个指针域分别指向第一个孩子结点,和第下一个兄弟结点
typedef struct CSNode{
ElemType data;
struct CSNode *firstchild,*nextsibling;
}CSNode,*CSTree;