洛谷 P1030 [NOIP2001 普及组] 求先序排列(先序,中序,后序)
https://www.luogu.com.cn/problem/P1030
题目描述
给出一棵二叉树的中序与后序排列。求出它的先序排列。
输入格式
共两行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列。
输出格式
共一行一个字符串,表示一棵二叉树的先序。
输入输出样例
输入 #1复制
BADC
BDCA
输出 #1复制
ABCD
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
const int N=200200,M=2002;
string s1,s2;
int len;
void dfs(int l1,int r1,int l2,int r2)
{
int m;//找到后序遍历的根节点,那就是我们先序遍历要的东西
for(int i=0;i<len;i++)
if(s1[i]==s2[r2])
{
m=i;
break;
}
cout<<s2[r2];
//如果有左子树,压缩右边界
if(m>l1)
dfs(l1,m-1,l2,r2-r1+m-1);
//如果有右子树,压缩左边界
if(m<r1)
dfs(m+1,r1,l2+m-l1,r2-1);
}
int main()
{
//cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
int T=1;
//cin>>T;
while(T--)
{
cin>>s1;//给定了一个中序遍历
cin>>s2;//再给定一个后序遍历
len=s1.size();
dfs(0,len-1,0,len-1);//遍历的条件就是从左到右
return 0;
}
return 0;
}