【题解】P1030 求先序排列
题面
前言
我嘞个超绝典题啊
正文
一些比较显然的思路捏~
首先我们知道对于一棵二叉树的后序遍历,一定有其最后一个数是根
然后我们在中序遍历中找到该根的位置
这个根前面的所有数构成根的左子树
同理,这个根后面的所有数构成根的右子树
注意到树的性质是非常强的
当我们删去根节点的时候,一棵树会分裂为两棵子树
然后我们就把一个规模较大的问题转化了规模较小的问题
显然分治捏
具体地,我们在中序遍历和后序遍历上维护这个不断更新的根
什么情况分治结束
自然是到叶子结点时停止操作
然后就差不多了
代码
#include<iostream>
#include<cstring>
using namespace std;
string s1,s2;
inline int find(char c){
for(int i=0;i<s1.length();i++){
if(s1[i]==c){
return i;
}
}
}
inline void dfs(int l1,int r1,int l2,int r2){
int mid=find(s2[r2]);
cout<<s2[r2];
if(mid>l1){
dfs(l1,mid-1,l2,r2-r1+mid-1);
}
if(mid<r1){
dfs(mid+1,r1,l2+mid-l1,r2-1);
}
return;
}
int main(){
cin>>s1>>s2;
dfs(0,s1.length()-1,0,s2.length()-1);
return 0;
}
后记
好讨厌元旦联欢会
完结撒花!