P1030 求先序排列 - 洛谷 | 计算机科学教育新生态
https://www.luogu.org/problem/P1030
输入 #1复制
BADC BDCA
输出 #1复制
ABCD
题目如上,对于这道题,我们可以利用树的递归性质来求解
已知后序序列和中序序列,我们可以逐次找根,输出根节点的值,再对左右子树分别来一波,就得到后序遍历的序列啦
比如样例数据 中序序列BADC 后序序列BDCA
后序序列的最后一个字符'A'就是这段序列里的根,接着在中序序列中找到'A'
那么B就是遍历左子树的中序序列,DC就是遍历右子树的中序序列了
由此我们也得到了左右子树的结点个数和各自的后序序列,就可以再对俩子树来一波,就可以了
核心代码如下:
void go(string a,string b)//a是后序遍历序列,b是中序遍历序列 { int lenl,lenr,len; len=a.length(); for(int i=0;i<len;i++) if(a[len-1]==b[i]) { lenl=i; cout<<a[len-1];//输出根节点的值 lenr=len-1-lenl; if(lenl!=0) { string part1(a,0,lenl),part2(b,0,lenl); go(part1,part2); } if(lenr!=0) { string part1(a,lenl,lenr),part2(b,lenl+1,lenr); go(part1,part2); } } }
string part(a,0,lenl)表示复制字符串a的a[0]到a[0+lenl-1]到part,也就是从0开始数lenl个