题目
根据给出的二叉树的前序遍历和中序遍历输出后序遍历。
输入
每个测试点(输入文件)有且仅有一组测试数据。
每组测试数据的第一行为一个由大写英文字母组成的字符串,表示该二叉树的前序遍历的结果。
每组测试数据的第二行为一个由大写英文字母组成的字符串,表示该二叉树的中序遍历的结果。
对于100%的数据,满足二叉树的节点数小于等于26。
输出
对于每组测试数据,输出一个由大写英文字母组成的字符串,表示还原出的二叉树的后序遍历的结果。
思路
令f(char *s1,char *s2)为前序遍历为s1,中序遍历为s2的后序遍历输出。
1.取出通过s1的第一个字符为当前的root
2.根据root在s2中找出左子树和右子树的数量
3.分别找出s1,s2的左右子树
4.调用f(s1left,s2left) f(s1right,s2right2)
5.最后输出root
代码
#include<cstdio>
#include<cstring>
using namespace std;
void f(char *a,char *b)
{
if(strlen(a)<=1)
{
printf("%s",a);
return;
}
char root=a[0];
char* aleft;
char* aright;
char* bleft;
char* bright;
int alen,blen;
alen=strlen(a);
blen=strlen(b);
aleft=a;
bleft=b;
bright=strchr(b,root);
*bright='\0';
int len=bright-bleft;
for(int i=0;i<len;i++) *(aleft+i)=*(aleft+i+1);
*(aleft+len)='\0';
aright=aleft+len+1;
bright=bright+1;
f(aleft,bleft);
f(aright,bright);
printf("%c",root);
}
int main()
{
char a[30],b[30];
scanf("%s%s",a,b);
f(a,b);
return 0;
}