天梯 玩转二叉树 (25 分)

玩转二叉树 (25 分)

给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。

输入格式:

输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其中序遍历序列。第三行给出其前序遍历序列。数字间以空格分隔。

输出格式:

在一行中输出该树反转后的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。

输入样例:

7
1 2 3 4 5 6 7
4 1 3 2 6 5 7

输出样例:

4 6 1 7 5 3 2
#include 
#include
#include
using namespace std;
struct node{
	   struct node * left;
	   struct node * right;
	   int data;
	   node(){
	   	left = right = NULL;
	   }
} ;
int   p[1009] ,in[1009] , n ;
struct node* Create( int pl ,int pr ,int inl ,int inr  ){
	  
	  struct node * root;
	  if( inl > inr )
	      return  NULL;
      root = new struct node ;
      root->data = p[ pl];
	  int k=1 ;
	  while( in[k] != p[ pl] )
	          k++;
	  
	  int num = k - inl;
	  root->right  = Create( pl+1 , pl + num ,inl ,k-1);
	  root->left   = Create( pl+num+1  ,pr, k+1,inr);
	    		   
	  return root;
}  
void BFS(  struct node * root ){ 
     int num =0; 
     queue < struct node * > q;
     q.push(root); 
     while( !q.empty() ){
     	 root = q.front();
     	 q.pop();
		 printf("%d",root->data);
     	 num++;
     	 if( num < n  )
     	     printf(" ");
	     
	     if( root->left   ){
		 	q.push( root->left ); 
		 } 
		 if( root->right   ){
	     	q.push( root->right);
		 }
	 } 
} 
int   main(void){   
      struct node * root; 
	  scanf("%d",&n);
	  for( int i=1;i<=n;i++)
	       scanf("%d",&in[i]);
	  for( int i=1;i<=n;i++)
	       scanf("%d",&p[i]); 
	  root =  Create(1,n,1,n);
	  BFS( root );    
	  return 0; 
}

 

你可能感兴趣的:(蓝桥杯)