思路:
二叉树模板题
中序+后序建树–>层序遍历BFS
Code:
#include<bits/stdc++.h>
using namespace std;
int in[30],po[30];
struct node{
int data,layer;
node *left,*right;
};
void create(node* &root,int il,int ir,int pl,int pr){
if(il>ir) return ;
int data=po[pr],j=il;
for(;j<=ir;j++){
if(in[j]==data) break;
}
int num=j-il;
if(root==NULL){
root=new node;
root->data=data;
root->left=root->right=NULL;
}
create(root->left,il,j-1,pl,pl+num-1);
create(root->right,j+1,ir,pl+num,pr-1);
}
vector<int> lay[30];
void bfs(node* &root){
queue<node*> q;
root->layer=0;
q.push(root);
while(!q.empty()){
node* tmp=q.front();
q.pop();
lay[tmp->layer].push_back(tmp->data);
if(tmp->left!=NULL){
tmp->left->layer=tmp->layer+1;
q.push(tmp->left);
}
if(tmp->right!=NULL){
tmp->right->layer=tmp->layer+1;
q.push(tmp->right);
}
}
}
int main(){
#ifndef ONLINE_JUDGE
freopen("data.txt","r",stdin);
#endif
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&in[i]);
for(int i=0;i<n;i++)
scanf("%d",&po[i]);
node *root=NULL;
create(root,0,n-1,0,n-1);
bfs(root);
printf("R:");
for(int i=0;i<30;i++){
if(lay[i].empty()) break;
printf(" %d",lay[i].back());
}
printf("\nL:");
for(int i=0;i<30;i++){
if(lay[i].empty()) break;
printf(" %d",lay[i][0]);
}
return 0;
}