Analysis : For the middle order and post order of the binary tree, the output layer order can be traversed after the binary tree is built. Pay attention to the left and right subtree boundaries when the tree is recursively built.
#include<iostream>#include<cstring>#include<vector>#include<stdio.h>#include<queue>#include<math.h>#include<stack>#include<algorithm>#include<map>#include<set>#define MAX 99999999typedeflonglong ll;usingnamespace std;int n,m;typedefstruct node{
int data;struct node* left;struct node* right;};int in[31],pos[31];
node*create(node* root,int inl,int inr,int posl,int posr){
if(inl >= inr)returnNULL;int key = pos[posr -1];if(root ==NULL)
root =(node*)malloc(sizeof(node));
root->data = pos[posr -1];
root->left =NULL;
root->right =NULL;int k =0;for(int i =0;i<inr;i++){
if(in[i]== key){
k = i;break;}}int num = k - inl;
root->left =create(root->left,inl,k,posl,posl+num);
root->right =create(root->right,k+1,inr,posl+num,posr-1);return root;}intmain(){
ios_base::sync_with_stdio(false);
cin.tie(0);
cin>>n;for(int i =0;i<n;i++)
cin>>pos[i];for(int i =0;i<n;i++)
cin>>in[i];
node* root =(node*)malloc(sizeof(node));
root =create(root,0,n,0,n);
queue<node*>q;
q.push(root);int ll =0;while(!q.empty()){
node* x = q.front();
q.pop();if(ll ==0){
ll =1;cout<<x->data;}else
cout<<" "<<x->data;if(x->left !=NULL)
q.push(x->left);if(x->right !=NULL)
q.push(x->right);}return0;}