题目描述
已知二叉树的中序和先序遍历可以唯一确定后序遍历、已知中序和后序遍历可以唯一确定先序遍历,但已知先序和后序,却不一定能唯一确定中序遍历。现要求根据输入的中序遍历结果及后序遍历结果,要求输出其先序遍历结果。
输入
第一行为中序序列 第二行为后续序列
输出
输出为遍历二叉树得到的先序序列
样例
BFDAEGC FDBGECA
样例输出
ABDFCEG
DCBFEG AH
DCFGEB HA,
A为根节点,在中序遍历中它的左边即为左子树(6个节点),右边为右子树(1个节点);在后序遍历中我们即可根据左右子树的节点个数确定后序遍历中的左右子树,根据后序遍历的性质,我们即可确定左右子树的根节点分别为:B,H。
#include<bits/stdc++.h>
#define ll long long
//#define int ll
#define pii pair<int,int>
#define mem(a,b) memset(a,b,sizeof(a))
#define endl '\n'
#define N 100005
const int inf=0x3f3f3f3f;
const double pi=acos(-1.0);
using namespace std;
void x(string z,string h)
{
if(!z.size()) return;
char c;
int k;
c=h[h.size()-1];
k=z.find(c);//找到c的索引
cout<<c;
x(z.substr(0,k),h.substr(0,k));//z.substr(0,k):从索引为0的元素开始截取k位
x(z.substr(k+1),h.substr(k,z.size()-k-1));//z.substr(k+1):从索引为5的元素开始截取到末尾
}
signed main()
{
string z,h;
cin>>z>>h;
x(z,h);
return 0;
}