如何将树的 "二叉链表存储形" 式转化为 "顺序存储形式" 以及树的 “顺序存储形式” 转化为 “二叉链表存储形式”

 

//首先将树的二叉链表存储形式转化为树的顺序存储形式

//首先知道树的顺序存储结构  它是利用完全二叉树的性质来定义的  不管一棵二叉树什么结构 它都可以补全成完全二叉树

//其实我们把二叉树的顺序表从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;  //此时表示这个结点的位置为空
	}
}

 

你可能感兴趣的:(数据结构和算法)