洛谷P1030c++递归求解先序排列

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个

原文地址:https://www.cnblogs.com/Neptune0/p/11529030.html