题目链接:点击打开链接
思路:根据中序和后序遍历序列创建出相应的BST,然后利用层序遍历,加上一些小技巧,根据要求输出节点序列。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
int in[50],post[50];
int root,leSon[50],rigSon[50];
void buildTree(int &r,int l1,int r1,int l2,int r2){//in post
if(l1 > r1 || l2 > r2) return;
int base = post[r2];
int loc;
for(loc = l1;loc <= r1;loc++){
if(in[loc] == base) break;
}
r = loc;
buildTree(leSon[r],l1,loc - 1,l2,l2 + loc - l1 - 1);
buildTree(rigSon[r],loc + 1,r1,l2 + loc - l1,r2 - 1);
}
void bfs(int r){
queue<int> q;
vector<int> v,re;
int last,cnt = 1;
q.push(r);
last = r;
while(!q.empty()){
int t = q.front();
v.push_back(t);
q.pop();
if(leSon[t]) q.push(leSon[t]);
if(rigSon[t]) q.push(rigSon[t]);
if(t == last){//当前层遍历完毕,现在队列中的节点即为该层所有的节点
if(cnt % 2 == 0){
for(int i = 0;i < v.size();i++){
re.push_back(in[v[i]]);
}
}
else{
for(int i = v.size() - 1;i >= 0;i--){
re.push_back(in[v[i]]);
}
}
v.clear();
last = q.back();
cnt++;
}
}
for(int i = 0;i < re.size();i++){
printf("%d%c",re[i],i == re.size() - 1 ?'\n':' ');
}
return;
}
int main(){
int n;
scanf("%d",&n);
memset(leSon,0,sizeof(leSon));
memset(rigSon,0,sizeof(rigSon));
for(int i = 1;i <= n;i++){
scanf("%d",&in[i]);
}
for(int i = 1;i <= n;i++){
scanf("%d",&post[i]);
}
buildTree(root,1,n,1,n);
bfs(root);
return 0;
}