分析 :给二叉树的中序和后序,建立二叉树后输出层序遍历即可,注意递归建立树时的左右子树边界即可。
#include <iostream>
#include <cstring>
#include <vector>
#include <stdio.h>
#include <queue>
#include <math.h>
#include <stack>
#include <algorithm>
#include <map>
#include <set>
#define MAX 99999999
typedef long long ll;
using namespace std;
int n, m;
typedef struct 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)
return NULL ;
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;
}
int main ( )
{
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) ;
}
return 0 ;
}