洛谷 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;
}
posted @ 2022-09-13 20:29  Vijurria  阅读(74)  评论(0编辑  收藏  举报