一、树和森林的概念
树:是n(n>=0)个结点的有限集合。若n=0,称为空树。若n>0,则有且仅有一个特定的称为根Root的结点;其余结点可分为m(m>=0)个互不相交的有限集T1,T2,...,Tm;
森林:m(m>=0)棵互不相交的树的集合。
二、树的存储结构
1.双亲表示法
-
实现:定义结构数组。存放树的结点,每个结点含有两个域:
- 数据域:存放结点本身信息。
- 双亲域:指示本结点的双亲结点在数组中的位置。
-
特点:找双亲容易,找孩子难。
-
C语言的类型描述
//结点的定义
typedef struct PTNode{
TElemType data;
int parent;
}PTNode;
// 树的结构
# define MAX_TREE_SIZE 100 //定义数组长度
typedef struct {
PTNode nodes[MAX_TREE_SIZE];//定义结点类型的数组用来存放结点
int r,n;//根节点的位置和结点个数
}PTree;
2.孩子链表
- 定义:把每个结点的孩子结点排列起来,看成是一个线性表,用单链表存储,则n个结点有n个孩子链表(叶子结点的孩子链表为空表)。而n个头指针又组成一个线性表,用顺序表(含有n个元素的结构数组)存储。
- C语言的类型描述
//孩子节点结构
typedef struct CTNode{
int child;
struct CTNode *next;
}*ChildPtr;
//双亲结点结构
typedef struct{
TElemType data;
ChildPtr firstchild;//孩子链表头指针
}CTBox;
//树结构
typedef struct{
CTBox nodes[MAX_TREE_SIZE];
int r,n;
}CTree;
- 特点:找孩子容易,找双亲难。
- 带双亲的孩子链表:方便查找双亲,双亲结点中再增加一个数据域用来存放该结点的双亲位置
3.孩子兄弟表示法
孩子兄弟表示法又称为二叉树表示法或二叉链表表示法。
- 实现:用二叉链表作树的存储结构,链表中每个结点的两个指针域分别指向其第一个孩子结点和下一个兄弟结点。
- C语言表示
typedef struct CSNode{
ElemType data;
struct CSNode *firstchild,*nextsibling;
}CSNode,*CSTree;