不管是利用 先序中序 求后序
还是利用 中序后序 求先序
都有一个核心关键,就是利用中序遍历寻找根的位置
找到中根遍历中 根的位置记为root
那么 root-l2就是左子数的长度
所以在先序遍历中 l1+root-l2 就是左子数的起始点下标
以此类推,后序中序求先序也是类似
先序中序求后序
#include<bits/stdc++.h>
using namespace std;
string a,b;
void dfs(int l1,int r1,int l2,int r2)
{
int root=b.find(a[l1]); //寻找根的位置,然后利用根的位置进行分割
if(root>l2)
dfs(l1+1,root-l2+l1,l2,root-1);
if(root<r2)
dfs(root-l2+l1+1,r1,root+1,r2);
cout<<a[l1];
}
int main()
{
cin>>a>>b;
dfs(0,a.size()-1,0,b.size()-1);
return 0;
}
后序中序求先序
#include<bits/stdc++.h>
using namespace std;
string a,b;
void dfs(int l1,int r1,int l2,int r2)
{
int root=b.find(a[r1]);
cout<<a[r1];
if(root>l2)
dfs(l1,root-l2+l1-1,l2,root-1);
if(root<r2)
dfs(root-l2+l1,r1-1,root+1,r2);
}
int main()
{
cin>>a>>b;
dfs(0,a.size()-1,0,b.size()-1);
return 0;
}