双亲表示法
-
实现: 定义结构数组存放树的结点,每个结点含两个域:
- 数据域:存放结点本身信息。
- 双亲域:指示本结点的双亲结点在数组中的位置。
-
例子 :
上图所示树的双亲表示法的数组下标为:
-
特点 :找双亲容易,找孩子难。
-
类型定义 :
typedef 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个头指针又组成一个线性表,用顺序表(含n个元素的结构数组)存储。
-
例子 :
-
类型定义 :
1.孩子结点结构
typedef struct CTNode
{
int child;
struct CTNode *next;
}*ChildPtr;
2.双亲结点结构
typedef struct
{
TElemType data;
ChildPtr firstchild; //孩子链表的头指针
}CTBox;
3.树结构
typedef struct
{
CTBox nodes[MAX_TREE_SIZE];
int n, r; //结点数和根结点的位置
};
-
特点 :找孩子容易,找双亲难。
-
为了解决找双亲难得问题,可以在双亲结点里增设一个指针域,存放双亲结点的下标——带双亲的孩子链表。
孩子兄弟表示法(二叉树表示法,二叉链表表示法)
-
实现: 用二叉链表作树的存储结构,链表中每个结点的两个指针域分别指向其第一个孩子结点和下一个兄弟结点。
-
类型定义:
typedef struct CSNode
{
ElemType daya;
struct CSNode *firstchild, *nextsibling;
}CSNode,*CSTree;
- 例子:
- 特点: 找孩子容易,找孩子的兄弟容易,找双亲难。
- 可以给每个结点增设一个指针域,从而解决找双亲难的问题。