这个题类似于UVA699,练习先序遍历,中序,后序。
建树类似于UVA699题目的代码
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int maxn= 100;
char pre_order[maxn],ino_order[maxn],pos_order[maxn];
char L[maxn],R[maxn];
int n,u=0;
int input(){
memset(L,0,sizeof(L));
memset(R,0,sizeof(R));
memset(pos_order,0,sizeof(pos_order));
u=0;
if(!(cin>>pre_order)) return 0;
cin>>ino_order;
n=strlen(ino_order);
return 1;
}
int build(int start1,int end1,int start2,int end2){
if(start1>end1) return 0;
int root=pre_order[start1];
int dig=start2;
while(ino_order[dig]!=root) dig++;
int cnt=dig-start2;
L[root]=build(start1+1,start1+cnt,start2,dig-1);
R[root]=build(start1+cnt+1,end1,dig+1,end2);
return root;
}
void list_pos_order(int root){
if(L[root]!=0) list_pos_order(L[root]);
if(R[root]!=0) list_pos_order(R[root]);
pos_order[u++]= root;
}
int main(){
while(input()){
build(0,n-1,0,n-1);
// for(int i =0; i<n; i++)
// printf("%c %c\n",pre_order[i],ino_order[i]);
// for(int i =0 ; i<100 ;i++)
// printf("%d %d %d\n",i,L[i],R[i]);
list_pos_order(pre_order[0]);
for(int i =0; i<n ; i++)
cout<<pos_order[i];
cout<<endl;
}
return 0;
}