题意:给出二叉树的先序遍历和中序遍历,输出后序遍历。
思路:先序遍历顺序为:根左右,中序遍历顺序为:左根右。也就是说,在中序遍历中找到先序遍历的第一个字符位置,可以将中序遍历分为左右两部分。按照这个思想,我们就可以用递归去解决这个问题。所谓后序遍历,就是先处理左右分支,最后输出根节点。
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <stack>
#include <map>
#include <queue>
#include <utility>
using namespace std;
#define rep(i,j,k) for (int i=j;i<=k;i++)
#define Rrep(i,j,k) for (int i=j;i>=k;i--)
#define Clean(x,y) memset(x,y,sizeof(x))
#define LL long long
#define ULL unsigned long long
#define inf 0x7fffffff
#define mod %100000007
const int maxn = 1009;
char s1[maxn],s2[maxn]; //s1是先序 s2是中序
void dfs(int l,int r,int root)
{
int pos;
if (r<l) return; //判断边界
rep(i,l,r) //先在中序中找到根节点的位置pos,分成左右部分递归处理
if ( s2[i] == s1[root] )
{
pos = i;
break;
}
if (l<r) dfs(l,pos-1,root+1);
if (l<r) dfs(pos+1,r,root+pos-l+1);
putchar(s1[root]);
}
int main()
{
while(scanf("%s %s",s1+1,s2+1)==2)
{
int len = strlen(s1+1);
dfs(1,len,1);
puts("");
}
return 0;
}