题目链接:P1030 [NOIP2001 普及组] 求先序排列 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
解题思路:
首先,一点基本常识,给你一个后序遍历,那么最后一个就是根(如ABCD,则根为D)。
因为题目求先序,意味着要不断找根。
那么我们来看这道题方法:(示例)
中序ACGDBHZKX,后序CDGAHXKZB,首先可找到主根B;
那么我们找到中序遍历中的B,由这种遍历的性质,可将中序遍历分为ACGD和HZKX两棵子树,
那么对应可找到后序遍历CDGA和HXKZ(从头找即可)
从而问题就变成求1.中序遍历ACGD,后序遍历CDGA的树 2.中序遍历HZKX,后序遍历HXKZ的树;
接着递归,按照原先方法,找到1.子根A,再分为两棵子树2.子根Z,再分为两棵子树。
就按这样一直做下去(先输出根,再递归);
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
void dfs(string s1,string s2){
if(s1.size()>0){
int ans=s2.size()-1;
cout << s2[ans];
int cnt=s1.find(s2[ans]);
dfs(s1.substr(0,cnt),s2.substr(0,cnt));
dfs(s1.substr(cnt+1),s2.substr(cnt,s1.size()-1-cnt));
}
}
int main()
{
string s1,s2;
cin >> s1 >> s2;
dfs(s1,s2);
return 0;
}