题目:http://202.194.62.52/contest/1824/problem/2
题意:给出先序遍历和中序遍历,求后序遍历。
先序遍历:根->左树->右树 中序遍历: 左树->根->右树
样例解释:
input:
DBACEGF ABCDEFG //前序遍历是DBACEGF,中序遍历是ABCDEFG
output:
ACBFGED
因为前序先遍历根 中序中间是根,可知D是根,所以BAC(ABC)是左大树,EGF(EFG)是右大树。同样的道理,得左大树:B是根,A是左树,C是右树 得右大树:
思路:先找到根,之后在左树中递归,右树中递归
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn=1e9+1;
string a,b ;//a 是前序,b 是中序
void find(ll al,ll ar,ll bl,ll br)
{
ll root;
if(al>ar||bl>br)return ;//打墙
for(ll i=bl;i<=br;i++)
{
if(b[i]==a[al])
{
root=i;//找到根节点
break;
}
}
find(al+1,al+root-bl,bl,root-1) ;//左大树
find(al+root-bl+1,ar,root+1,br) ;//you
cout<<a[al];
}
int main()
{
while(cin>>a>>b)
{
ll len=a.size();
find(0,len-1,0,len-1);
putchar('\n');
}
}