/*
*Copyright (c) 2014,烟台大学计算机学院
*All rights reserved.
*文件名称:Annpion.cpp
*作者:王耀鹏
*完成日期:2016年1月6日
*版本号:v1.0
*
*问题描述:二叉树的构造
*输入描述:无
*输出描述:输出先序和中序构造二叉树、中序和后序构造二叉树、顺序存储结构转为二叉链存储结构
*/
#include <stdio.h>
#include <malloc.h>
#include "BTree.h"
typedef ElemType SqBTree[MaxSize];
BTNode *CreateBT1(char *pre,char *in,int n)//由先序序列和中序序列构造二叉树
/*pre存放先序序列,in存放中序序列,n为二叉树结点个数,
本算法执行后返回构造的二叉链的根结点指针*/
{
BTNode *p;
char *ch;
int i;
if(n<=0) return NULL;
p=(BTNode *)malloc(sizeof(BTNode));
p->data=*pre;
for(ch=in;ch<in+n;++ch)
if(*ch==*pre)
break;
i=ch-in;
p->lchild=CreateBT1(pre+1,in,i);
p->rchild=CreateBT1(pre+i+1,ch+1,n-i-1);
return p;
}
BTNode *CreateBT2(char *post,char *in,int n)//由后序序列和中序序列构造二叉树
/*post存放后序序列,in存放中序序列,n为二叉树结点个数,
本算法执行后返回构造的二叉链的根结点指针*/
{
BTNode *p;
char *ch;
int i;
if(n<=0) return NULL;
p=(BTNode *)malloc(sizeof(BTNode));
p->data=*(post+n-1);
for(ch=in;ch<in+n;++ch)
if(*ch==*(post+n-1))
break;
i=ch-in;
p->lchild=CreateBT2(post,in,i);
p->rchild=CreateBT2(post+i,ch+1,n-i-1);
return p;
}
BTNode *trans(SqBTree a,int i)//由顺序存储结构转为二叉链存储结构
{
BTNode *p;
if(i>MaxSize||a[i]=='#')
return NULL;
p=(BTNode *)malloc(sizeof(BTNode));
p->data=a[i];
p->lchild=trans(a,2*i);
p->rchild=trans(a,2*i+1);
return p;
}
int main()
{
ElemType pre[]="ABDGCEF",in[]="DGBAECF",post[]="GDBEFCA",s[]="0ABCD#EF#G####################";
BTNode *b3,*b2,*b1;
b1=CreateBT1(pre,in,7);
printf("b1:");
DispBTNode(b1);
printf("\n");
b2=CreateBT2(post,in,7);
printf("b2:");
DispBTNode(b2);
printf("\n");
b3=trans(s,1);
printf("b3:");
DispBTNode(b3);
printf("\n");
return 0;
}
运行结果: