1 双亲表示法
实现:定义结构数组存放树的结点,每个结点含两个域。
数据域:存放结点本身信息。
双亲域:指示本结点的双亲结点在数组中的位置。
特点:找双亲容易,找孩子难。
C语言的类型描述:
结点结构:data | parent
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个元素的结构数组)存储。
特点:找孩子容易,找双亲难。
孩子结点结构:child | next
tpyedef struct CTNode{
int child;
struct CTNode *next;
}*ChildPtr;
双亲结点结构:data | firstchild
typedef struct{
TElem Type data;
ChildPtr firstchild; //孩子链表头指针
}CTBox;
树结构:
tyoedef struct{
CTBox nodes[MAX_TREE_SIZE];
int n, r; //结点个数和根结点位置
}CTree;
3 孩子兄弟表示法(二叉树表示法)
实现:用二叉链表做树的存储结构,链表中每个结点的两个指针域分别指向其第一个孩子结点和下一个兄弟结点。
typedef struct CSNode{
ElemType data;
struct CSNode *firstchild, *nextsibling;
}CSNode, *CSTree;
树与二叉树的转换
将树转化为二叉树进行处理,利用二叉树的算法来实现对树的操作。
由于树和二叉树都可以用二叉链表作存储结构,,则以二叉链表作媒介可以导出树与二叉树之间的一个对应关系。
树变二叉树:兄弟相连留长子。
二叉树变树:左孩右右连双亲,去掉原来右孩线。
森林与二叉树的转化
森林转化为二叉树:树变二叉根相连。
二叉树转化为森林:去掉全部右孩线,孤立二叉再还原。
树与森林的遍历
树的遍历(三种方式)
1.先根遍历:若树不空,则先访问根结点,然后依次先根遍历各颗之树。
2.后根遍历:若树不空,则先依次后根遍历各颗之树,然后访问根结点。
3.按层次遍历:若树不空,则自上而下自左而右访问树中每个结点。
森林的遍历
1.先序遍历:依次从左至右对森林中的每一棵树进行先根遍历。
2.中序遍历:依次从左至右对森林中的每一棵树进行后根遍历。