前中后序的相互转换只需要考虑对应的子树是否存在节点即可,有中序的顺序判断子树关系,由前(开始为根)或后(末尾为根)序遍历判断当前子树的根是哪个节点;
#include<iostream>
#include<vector>
using namespace std;
vector<int>in, pre, ans[10];
int pos[100];
int n;
void dfs(int node, int d,int l,int r,int index) {
ans[d].push_back(node);
if (r<=l) return;
if (index - r + pos[node] -1>= 1&&pos[node]-l>=1)
dfs(pre[index - r + pos[node]-1],d+1, l,pos[node]-1, index - r + pos[node]-1);
if ( pos[node]<r && index - 1 >= 1)
dfs(pre[index-1], d + 1, pos[node] + 1, r, index - 1);
}
int main()
{
cin >> n;
in.resize(n + 1), pre.resize(n+1);
for (int i = 1; i <= n; i++) {
cin >> in[i];
pos[in[i]] = i;
}
for (int i = 1; i <= n; i++) {
cin >> pre[i];
}
dfs(pre[n], 1, 1, n, n);
int d = 2;
printf("%d",ans[1][0]);
while (ans[d].size() > 0) {
if (d % 2 == 0) {
for (int i = 0; i < ans[d].size(); i++)
printf(" %d", ans[d][i]);
}
else {
for (int i = ans[d].size() - 1; i >= 0; i--)
printf(" %d", ans[d][i]);
}
d++;
}
getchar();
getchar();
return 0;
}
浙公网安备 33010602011771号