目录
树的几种存储结构及其特点
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、森林的遍历
依次遍历每棵树所得序列就是森林的遍历










