代码如下,思路详见注释:
#include<stdio.h>
#include<iostream>
#include<queue>
using namespace std;
typedef struct Bitree{
char data;
struct Bitree *lchild;
struct Bitree *rchild;
}Bitree,*Bi;
typedef struct{
int lel; //指向当前处理的元素在层次序列中的位置
int low,high; //中序序列的上下界
Bi parent; //层次序列中当前结点的双亲结点指针
int lr; //判断左右子树,1为左,2为右
}Sq;
void preorder(Bi p);
void Creat(Bi &bt,char lev[],char in[],int n)
{
Sq q;
queue <Sq> Q;
if(n<1)
bt=NULL; //二叉树为空
else
{
int i,s;
i=s=0; //s指向层次序列中当前处理的元素,i用来寻找当前处理的元素在中序序列中的位置
bt=new Bitree;
bt->data=lev[0];
bt->lchild=bt->rchild=NULL;
while(in[i]!=lev[0])
i++;
if(i==0 && i==n-1) return ; //只有一个根节点
if(i==0) //没有左子树
{
bt->lchild=NULL;
q.lel=++s; q.low=i+1; q.high=n-1; q.lr=2; q.parent=bt;
Q.push(q);
}
else if(i==n-1) //没有右子树
{
bt->rchild=NULL;
q.lel=++s; q.low=0; q.high=i-1; q.lr=1; q.parent=bt;
Q.push(q);
}
else
{
q.lel=++s; q.low=0; q.high=i-1; q.lr=1; q.parent=bt;
Q.push(q);
q.lel=++s; q.low=i+1; q.high=n-1; q.lr=2; q.parent=bt;
Q.push(q);
}
while(!Q.empty())
{
q=Q.front(); Q.pop();
Bi fat=q.parent;
i=q.low;
while(in[i]!=lev[q.lel])
i++;
Bi p=new Bitree;
p->data=lev[q.lel];
p->lchild=p->rchild=NULL;
if(q.lr==1)
fat->lchild=p;
else
fat->rchild=p;
if(i==q.low && i==q.high) //叶子结点,无孩子
{
p->lchild=p->rchild=NULL;
continue;
}
else if(i==q.low) //没有左孩子
{
p->lchild=NULL;
q.lel=++s; q.low=i+1; q.parent=p; q.lr=2;
Q.push(q);
}
else if(i==q.high) //没有右孩子
{
p->rchild=NULL;
q.lel=++s; q.high=i-1; q.parent=p; q.lr=1;
Q.push(q);
}
else
{
int high=q.high; //备份一下
q.lel=++s; q.high=i-1; q.parent=p; q.lr=1;
Q.push(q);
q.lel=++s; q.low=i+1; q.high=high; q.parent=p; q.lr=2;
Q.push(q);
}
}
}
}
int main()
{
int n;
Bitree *B;
char in[50],lev[50];
printf("请输入结点个数\n");
cin>>n;
printf("请输入中序遍历和层次遍历\n");
getchar();
gets(in); gets(lev);
Creat(B,lev,in,n);
printf("构造完成,输出先序序列\n");
preorder(B);
return 0;
}
void preorder(Bi p)
{
if(p)
{
printf("%c ",p->data);
preorder(p->lchild);
preorder(p->rchild);
}
}