树的重建, 还算简单。
就是在构建的时候要注意从小数开始往上加, 不然会爆栈。
#include <cstdio>
#include <cstring>
#define MAXN 100
char in_order[MAXN], per_order[MAXN];
int len, lch[MAXN], rch[MAXN];
int build(int L1, int R1, int L2, int R2) {
if(L1 > R1) return 0;
int root = per_order[L2];
int p = L1;
while(in_order[p] != root) p++;
int cnt = p - L1;
lch[root] = build(L1, p - 1, L2 + 1, L2 + cnt);
rch[root] = build(p + 1, R1, L2 + cnt + 1, R2); //错误 : build(p + 1, R1, R2 - cnt + 1, R2);
return root;
}
void dfs(int root) {
if(lch[root]) dfs(lch[root]);
if(rch[root]) dfs(rch[root]);
printf("%c", root);
}
int main() {
while(~scanf("%s%s", per_order, in_order)) {
len = strlen(per_order);
build(0, len - 1, 0, len - 1);
dfs(per_order[0]);
printf("\n");
}
return 0;
}