P1030 [NOIP2001 普及组] 求先序排列 题解
本题完全是一道初赛题。别问我为什么,问就是你去翻翻J组初赛题,看能不能翻到这类题。
好了,话不多说,上思路!
- 找到根节点(后序遍历的最后一个字母),输出它,再在中序遍历中找到它。那么它的左边就是左子树,右边就是右子树;
- 把左子树挑出来,并找出它的根。然后再不断重复本步骤;
- 输出完左子树的根后,再去输出右子树的根。
虽然上述内容很抽象,但最激动人心的时刻到了:上代码!
#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\) 位提取出来。
完结撒花。

浙公网安备 33010602011771号