后中序列建树,easy,bfs里用一个maxLayer来判断是否到达新的一层,到新的就输出
//建树然后bfs,每层第一个数就直接输出,就maxLayer来判断是否是第一次出现这个层
#include<iostream>
#include<unordered_map>
#include<vector>
#include<queue>
using namespace std;
int n;
struct node{
int val;
node* lchild, *rchild;
int layer;
};
vector<int> inOrder(n+2);
vector<int> preOrder(n+2);
unordered_map<int,int> ma;
int maxLayer = -1;
node* buildTree(int preL,int preR,int inL,int inR){
if(preL > preR) return nullptr;
node* root = new node;
root->val = preOrder[preL];
root->lchild = root->rchild = nullptr;
int leftSubTree = ma[preOrder[preL]] - inL;
root->lchild = buildTree(preL+1,preL+leftSubTree,inL,inL+leftSubTree-1);
root->rchild = buildTree(preL+leftSubTree+1,preR,inL+leftSubTree+1,inR);
return root;
}
void bfs(node* s){
s->layer = 0;
queue<node*> q;
q.push(s);
bool flag = true;
while(!q.empty()){
node* topNode = q.front();
q.pop();
if(topNode->layer > maxLayer){
if(flag == true){
cout<<topNode->val;
maxLayer = topNode->layer;
flag = false;
}
else{
cout<<" "<<topNode->val;
maxLayer = topNode->layer;
}
}
if(topNode->lchild != nullptr){
topNode->lchild->layer = topNode->layer+1;
q.push(topNode->lchild);
}
if(topNode->rchild != nullptr){
topNode->rchild->layer = topNode->layer+1;
q.push(topNode->rchild);
}
}
}
int main(){
cin>>n;
for(int i = 0; i < n; i++){
cin>>inOrder[i];
}
for(int i = 0; i < n; i++){
cin>>preOrder[i];
}
for(int i = 0; i < n; i++){
ma[inOrder[i]] = i;
}
node* root = new node;
root = buildTree(0,n-1,0,n-1);
bfs(root);
return 0;
}