P1030 [NOIP2001 普及组] 求先序排列 题解

题目传送锚点

在博客园食用更佳

本题完全是一道初赛题。别问我为什么,问就是你去翻翻J组初赛题,看能不能翻到这类题。

好了,话不多说,上思路!

  1. 找到根节点(后序遍历的最后一个字母),输出它,再在中序遍历中找到它。那么它的左边就是左子树,右边就是右子树;
  2. 把左子树挑出来,并找出它的根。然后再不断重复本步骤;
  3. 输出完左子树的根后,再去输出右子树的根。

虽然上述内容很抽象,但最激动人心的时刻到了:上代码!

#include<bits/stdc++.h>
#define int long long
using namespace std;

string a,b;										//a是中序,b是后序

void f(string a,string b)						//a是本段的序,b是本段的后序
{
	if(!a.size()) return;						//如果a里啥都没有,那b里也会啥都没有,那就别遍历了
    cout<<b[b.size()-1];						//输出根
    int z=a.find(b[b.size()-1]);                //记录一下根在中序的位置
    f(a.substr(0,z),b.substr(0,z));             //去遍历左子树
    f(a.substr(z+1),b.substr(z,a.size()-z-1));  //去遍历右子树
}

signed main()
{
    cin>>a>>b;
    f(a,b);                                     //遍历开始
    return 0;
}

不会 s.substr(a,b) 就查资料,大概就是把字符串 \(s\) 中的第 \(a\) 到第 \(b\) 位提取出来。

完结撒花。

posted @ 2025-01-27 18:15  cath20  阅读(144)  评论(0)    收藏  举报