思路:递归
手工推一遍后序,然后用代码模拟实现就好。
可以发现,先序遍历第一个数必是根节点,中序遍历中,根节点左边便是左子树,右边便是右子树,根据这一思路,同递归写就好
#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <vector>
#include <map>
#include <queue>
using namespace std;
#define IOS ios::sync_with_stdio(false);cin.tie(0)
#define _for(i,a,b) for(int i=(a) ;i<=(b) ;i++)
#define _rep(i,a,b) for(int i=(a) ;i>=(b) ;i--)
#define mst(x,y) memset(x,y,sizeof(x))
#define all(v) v.begin() , v.end()
#define pb(v) push_back(v)
#define INF 0x3f3f3f3f
#define int long long
#define lson p*2,l,mid
#define rson p*2+1,mid+1,r
typedef long long ll;
const int N = 1e5+10;
char s1[N];//先序
char s2[N];//中序
int len1;
int len2;
void solve(int l1 ,int r1 , int l2 ,int r2)//先序遍历中左/右子树区间,中序遍历中左/右子树区间
{
if(l1>r1 || l2>r2) return ;
char root = s1[l1];//记录先序遍历中的根
int temp=-1;//记录根节点在中序遍历中的位置
//s2中找根
_for(i,l2,r2)
{
if( s2[i] == root )
{
temp = i;
break;
}
}
//左右根顺序输出
solve(l1+1 , temp-1-l2+l1+1 , l2 , temp-1);
solve(r1-(r2-temp-1) , r1, temp+1 , r2);
cout<<root;
}
signed main()
{
//!!!!!!!!!!!!!!!!!!!!!!
// freopen("data.txt","r",stdin);
//!!!!!!!!!!!!!!!!!!!!!!
IOS;
cin>>(s1+1);
cin>>(s2+1);
len1 = strlen(s1+1);
len2 = strlen(s2+1);
solve(1,len1,1,len2);
}