1.1树的存储结构
1.双亲表示法
树的每个结点都有唯一的双亲,基于这一性质,可以用连续的一组空间存储树的结点,同时在每个结点中附设一个指示器指示其双亲结点在链表中的位置。双亲表示法可以方便地查找结点的双亲和祖先,但是查找孩子结点或者子孙时需要遍历整个树结构。
#define maxsize 100
typedef struct
{
datatype data;
int parent;
}PTNode;
typedef struct
{
PTNode nodes[maxsize];
int n;//结点数
}PTree;
2.孩子双亲表示法
孩子表示法是指用一个与树结点个数同样大小的一维数组,并且数组的每一个元素由两个域组成,一个域存放结点信息,另一个域是一个指针,用来指向该结点所有孩子结点组成的单链表中的第一个孩子结点。
typedef struct CTNode
{
int child;
struct CTNode *next;
}*ChildPtr;
typedef strcut
{
datatype data;
ChildPtr child;//孩子链表表头指针
int parent;
}CTBox;
typedef struct
{
CTBox nodes[maxsize];
int n;//结点数
}CTree;
1.2树、森林与二叉树的转换
1.树、森林转换成二叉树
1)在兄弟之间加连线;
2)保留结点与第一个孩子之间的连线,去掉其余的连线;
3)以根结点为轴心,将树顺时针旋转一定的角度,使之层次分明。
由于树的根结点没有兄弟结点,故转换之后的二叉树其右子树必为空。
2.森林转换成二叉树
1)把每一棵树依次转换为二叉树。
2)第一颗二叉树不动,从第二颗二叉树开始,依次把后一颗二叉树的根结点作为前一颗二叉树的根结点的右孩子,用线连接起来。
3)以第一棵树的根为轴心,顺时针旋转一定的角度。
3.二叉树转换为森林
假如一棵二叉树的根节点有右孩子,则这棵二叉树能够转换为森林,否则将转换为一棵树。
1)从根节点开始,若右孩子存在,则把与右孩子结点的连线删除重复这一过程,直到所有这些根节点与右孩子的连线都删除为止。
2)将每棵分离后的二叉树转换为树,使之层次分明。