已知前、中序遍历结果,求后序遍历结果。
pre: abefcg
in: ebfagc
思路:前、中和后序遍历都是对于根节点来说的,前序就是说跟最先访问,然后再进行递归的前序遍历其左右子树
自顶向下分析
对于前序遍历,分为(a)(bef)(cg) 分别为根,前序遍历左子树的结果,前序遍历右子树的结果;
对于中序遍历,分为(ebf)(a)(gc) 分别为中序遍历左子树的结果,根,中序遍历右子树的结果。
可见,先找到两种遍历结果的根(即上面的a的位置,前序为首个元素,中序要找到它~),可以构造一个递归函数,对其进行访问,但每次都要确定访问的起始位置。
如下:
#include <iostream> #include <string> using namespace std; void printPost(const string& pre, const string& in, int start1, int start2, int size){ if(size==1){ printf("%c",pre[start1]); return; } if(size==0) return; int i = in.find(pre[start1]); printPost(pre,in,start1+1,start2,i-start2); printPost(pre,in,start1+1+i-start2,i+1,size-i+start2-1); printf("%c",pre[start1]); } int main(){ string pre; string in; cin >> pre >> in; printPost(pre,in,0,0,pre.size()); cout<<endl; return 0; }
浙公网安备 33010602011771号