树的遍历,根据后序遍历顺序和中序遍历顺序找到层序遍历,
这个主要就是挨个找孩子的根节点,利用后序遍历根最后访问的原则,逐步确定子节点先后顺序。
值得一提的是,在此处利用完全二叉树的标号顺序,按照找到根节点的次序标号,可以直接找到答案。
附本人AC代码:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
struct Node {
int val, leavel;
};
vector<int>Vpost, Vin;
vector<Node>ans;
bool cmp(Node&A, Node&B) {
return A.leavel < B.leavel;
}
void findroot(int begin, int end,int index,int leavel) {
if (begin > end)return;
int root;
for (int i = begin; i <= end; i++) {
if (Vin[i] == Vpost[index]) {
root = i;
break;
}
}
ans.push_back({ Vpost[index],leavel });
int lchild = index - (end - root) - 1;
int rchild = index-1;
if (lchild >= 0)findroot(begin, root - 1, lchild, leavel * 2 + 1);
if (end - root > 0)findroot(root + 1, end, rchild, leavel * 2 + 2);
}
int main() {
int N;
scanf("%d", &N);
Vpost.resize(N);
Vin.resize(N);
for (int i = 0; i < N; i++) {
scanf("%d", &Vpost[i]);
}
for (int i = 0; i < N; i++) {
scanf("%d", &Vin[i]);
}
findroot(0, N - 1, N - 1, 0);
sort(ans.begin(), ans.end(), cmp);
for (int i = 0; i < ans.size(); i++) {
if (i == 0)printf("%d", ans[i]);
else printf(" %d", ans[i]);
}
return 0;
}