题目名:已知树的中序和逐层遍历,求前序遍历;/题目保证各个字符ASCLL码值不同;
时间:2016.8.7;
分析:由逐层遍历可知根与子的关系(此题目下为根在前,子在后);
地柜对某一区间建树,扫描区间得到在逐层遍历中最先出现的位置,即为所建树的根节点,输出当前根的值,再递归对左和右两个区段建树;
代码如下:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
char zx[300],zc[300]; //zx为中序遍历,zc为逐层遍历;
int sd[300]; //对于sd[i],i为字符所对应的ASCLL码,sd[i]为此字符在逐层遍历中出现的位置;
using namespace std;
void dive(int b,int e){
if(b>e) return; //如果输出错误,极有可能在此;
int k=1299,root;
for(int i=b;i<=e;i++){
if(sd[zx[i]]<k){
k=sd[zx[i]];
root=i;
}
}
putchar(zx[root]);
dive(b,root-1);
dive(root+1,e);
}
int main(){
gets(zx);
gets(zc);
int len=strlen(zx)-1;
for(int i=0;i<=len;i++){
sd[zc[i]]=i;
}
dive(0,len);
return 0;
}