//首先将树的二叉链表存储形式转化为树的顺序存储形式
//首先知道树的顺序存储结构 它是利用完全二叉树的性质来定义的 不管一棵二叉树什么结构 它都可以补全成完全二叉树
//其实我们把二叉树的顺序表从1开始 (有些也可以从0开始 此时它的左右孩子就变成了 2*i+1 / 2*i+2)
//它的左右孩子为2*i 2*i+1
可以直接通过树的遍历算法来实现 用树的结点来做索引 每次如果遇到空的情况 直接将该数组值变为‘/’
接下来看代码演示(函数命名不要介意)
//T为根节点 K数组用来存放数据 i表示该数据在数组中的下标 在这之前先将K数组全部初始化为‘/’
void TranstoArray(BiTree T, char K[], int i) {
if (T) {
K[i] = T->data;
TranstoArray(T->lchild, K, 2 * i);
TranstoArray(T->rchild, K, 2 * i + 1);
}
else
{
K[i] = '/'; //若T为空 说明上个结点的左或右孩子中必有空的情况
}
}
而将树的顺序存储结构转化为树的二叉链式存储结构 和上面相反
此时用数组K来索引 每次通过数组K的值来创建二叉树结点 所以要用"指针的指针"或者"指针的引用"来创建一颗新的二叉树结构
代码如下:
//T表示一个在主函数中定义的指针的地址(指针的指针)
//过程类似于二叉排序树 ,AVL的创建
void TranstoTable(BiTree *T, char K[], int i) {
if (K[i] != '/') {
BiTree temp = new BiNode; //用来申请新的空间
temp->data = K[i];
temp->lchild = temp->rchild = NULL;
(*T) = temp;
TranstoTable(&(*T)->lchild, K, 2 * i); //每次通过改变左右指针的空间来继续创建
TranstoTable(&(*T)->rchild, K, 2 * i + 1);
}
else
{
(*T) = NULL; //此时表示这个结点的位置为空
}
}