这个算法本身是存在问题的,不细究。等大四我再写一个完善的算法。考试的时候可以写这个算法,思路没错,但是有种特殊情况这个算法没考虑。
#include<iostream>
#include<malloc.h>
using namespace std;
struct Betree{
char c;
Betree *lchild,*rchild;
};
char fore[100],mid[100];
void preorder(Betree *t)
{
if(t==NULL)
return;
else {
cout<<t->c<<" ";
preorder(t->lchild);
preorder(t->rchild);
}
}
Betree* creatBt(int i,int j,int x,int y)
{
if(i>j||x>y)
return NULL;
else {
Betree* t=(Betree*)malloc(sizeof(Betree));
t->c=fore[i];
int L,k;
k=x;
while(fore[i]!=mid[k])
k=k+1;
L=k-x;
if(k==x)
t->lchild=NULL;
else t->lchild=creatBt(i+1,i+L,x,k-1);
if(k==y)
t->rchild=NULL;
else t->rchild=creatBt(i+L+1,j,x+L+1,y);
return t;
}
}
int main()
{
int n,i;
while(1)
{
cin>>n;
Betree* tree=0;
for(i=1;i<=n;i++)
cin>>fore[i];
for(i=1;i<=n;i++)
cin>>mid[i];
tree=creatBt(1,n,1,n);
preorder(tree);
cout<<endl;
}
return 0;
}