以题目中给出得例子为例,通过后序遍历取最后一位可以得到当前子树的根节点为:A,然后到中序遍历里面取寻找这个根节点,从而可以通过中序遍历来将当前树分割成左子树和右子树。
然后递归重复这个过程就可以得到先序遍历。要注意递归的条件要l1>r1,因为在边界处可以会出现l1>r1的情况这时候要直接结束这一层递归。
#include <bits/stdc++.h>


using namespace std;

string zhong, hou;
int len;

void xian(int l1, int r1, int l2, int r2) {
    if (l1>r1) return;
    //由后序遍历的最后一位来确定当前子树的根节点
    char root = hou[r2];
    printf("%c", root);
    int pos;
    //通过根节点去中序遍历里面找分割点
    for (pos=l1;pos<=r1;pos++) {
        if (zhong[pos]==root) break;
    }
    //先左后右的深入递归
    xian(l1, pos-1, l2, l2+(pos-1-l1));
    xian(pos+1, r1, l2+(pos-1-l1)+1, r2-1);
}

int main() {
    cin>>zhong>>hou;
    len = zhong.length();
    //先中序后后序
    xian(0, len-1, 0, len-1);
    
    return 0;
}