主体思想,利用后序最后一个一定是根节点开始,利用后序找到根节点,利用中序输出节点。
我们以洛谷一道题举例
P1030 [NOIP2001 普及组] 求先序排列
下面是我的AC代码
#include "bits/stdc++.h"
using namespace std;
string s1,s2;
void work(int start,int end,int boot){
if (start>end) return;
int i=start;
while(i<end&&s1[i]!=s2[boot])i++;
cout<<s1[i];
work(start,i-1,boot-1+i-end);
work(i+1,end,boot-1);
}
int main(){
cin>>s1>>s2;
work(0, s1.size()-1,s1.size()-1);
return 0;
}//s1为中序,s2为后序
我们的start 和end是针对中序,而boot是针对后序来找到根节点;
主要代码
#include "bits/stdc++.h"
using namespace std;
string s1,s2;
void work(int start,int end,int boot){
if (start>end) return;//不能加等号,这只是一个判断空节点的条件
int i=start;
while(i<end&&s1[i]!=s2[boot])i++;//找到根节点
cout<<s1[i];//因为前序是根前后,所以我们找到这个节点直接输出
work(start,i-1,boot-1+i-end);//在中序中前面,i-end为该节点右节点的节点数,我们减去就得到了左边这个节点(后序的特点)
work(i+1,end,boot-1);//右边遍历
}
int main(){
cin>>s1>>s2;
work(0, s1.size()-1,s1.size()-1);
return 0;
}//s1为中序,s2为后序
我之前还有一篇写知道前中,求后的,虽然很垃圾,或许有用