已知一棵完全二叉树存于顺序表sa中,sa.elem[1…sa.length]含结点值,试编写算法由此顺序存储结构建立该二叉树的二叉链表。
分析:由二叉树的性质可知,一个下标为i的节点若有左子树,则其左子树的下标为2i,右子树下标为2i+1
上代码:
//主函数中传入的i为1
void CreateTree(Sqlist sa, BiTree *T, int i)//前序创建
{
(*T) = (BiTree)malloc(sizeof(BiTNode));//分配空间
(*T)->data = sa.elem[i];
if(sa.length >= 2 * i)//若长度大于2i,证明此节点有左子树
CreateTree(sa, &(*T)->lchild, 2*i);
else
{
(*T)->lchild = NULL;
}
if(sa.length >= 2 * i + 1) //若长度大于2i+1,证明此节点有右子树
CreateTree(sa, &(*T)->rchild, 2*i + 1);
else
{
(*T)->rchild = NULL;
}
}