目录
树的几种存储结构及其特点
1、双亲表示法
方法:
把节点按层次遍历顺序编号。
按层次遍历顺序把节点存入结构体数组,
结构体数组的两个域一个是数据域,另一个是父节点位置编号。
C语言的类型描述:
#define maxtreesize 100
typedef struct PTNode
{
ELem data;//数据域
int parent;//双亲位置域
}PTNode;
typedef struct
{
PRNode nodes[maxtreesize];//数组
int r;//根节点位置
int n;//结点总数
}PTree;
2、孩子链表表示法
方法:
把节点按层次遍历顺序编号。
所有的兄弟节点形成一个单链表。
存储结构由结构体数组和单链表构成。
结构体数组中有两个域,一个存节点数据,另一个是指向本节点孩子链表的指针。
//孩子链表
typedef struct CTNode
{
int child;//孩子结点位置
struct CTNode *next;
}CTNode,*ChildPtr;
//双亲结点
typedef struct
{
Elem data;//数据域
ChildPtr firstchild;//孩子链表的头指针
}CTBox;
//树结构
typedef struct
{
CTBox nodes[maxtreesize];//结点数组
int r;//根节点
int n;//总数
}CTree;
3、孩子兄弟表示法
一个结点或者没有最左边的孩子,或者有一个最左边的孩子,
同样,一个结点或者没有右兄弟,或者有一个右兄弟。
typedef struct CSNode
{
Elem data;
struct CSNode ,*firstchild,*nextsibling;
//左孩子 右兄弟
}CSNode, *CSTree;
6.4.2、森林与二叉树的转换
1.树到二叉树的转换
1.树到二叉树的转换
(1)将所有兄弟结点用线连起来;除第一个孩子外,去掉每个结点与双亲结点的连线。
(2)以根为轴心,将树按顺时针方向旋转45度,就转化成了相应的二叉树。
二叉树与“树转换的二叉树”都可以用二叉链表存储,也就是实际存储结构是相同的,无非是逻辑描述不同。
逻辑描述有何不同?
(1)左链一个指向左孩子,一个指向第一个孩子。
(2)右链一个指向右孩子,一个指向右兄弟
2.森林到二叉树的转换
森林即有若干棵树。
(1)将每棵树先转换成二叉树;
(2)从第二棵树开始,每棵树的根结点都看成是其前一棵树的根结点的兄弟。
3.二叉树到树或森林的转换
方法:
(1) 若二叉树中某结点是其双亲结点的左孩子(第一个左孩子/左子树),则该结点的右孩子(某结点的其他子节点),右孩子的右孩子……都与该结点的双亲结点连线;
(2) 去掉右孩子与原双亲结点的连线;
若是转换成森林,还要将与根相连的右孩子连线去掉。
6.4.3、树和森林的遍历
1、树的前序遍历与转换成二叉树的前序遍历的比较 相同
2、树的后序遍历与转换成二叉树的中序遍历的比较 相同
3、树的中序遍历
若树不空,
中遍历树的最左边的孩了;
访问根结点;
依次中序遍历其它孩子;
4、森林的遍历
依次遍历每棵树所得序列就是森林的遍历