以题目中给出得例子为例,通过后序遍历取最后一位可以得到当前子树的根节点为: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;
}

京公网安备 11010502036488号