玩转二叉树
给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数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
这个题和刚刚写的那个类似也是一个建树的过程;
比如中序是1 2 3 4 5 6 7 前序是 4 1 3 2 6 5 7 由前序可得4是树根,1是4的左孩子,然后通过中序可知1 2 3是左子树5 6 7是右子树,通过前序可知6是4 的右孩子,这样依次递归。
代码:
1 #include <iostream> 2 #include <cstdio> 3 #include <set> 4 #include <vector> 5 #include <cstring> 6 #include <queue> 7 #include <algorithm> 8 using namespace std; 9 typedef long long ll; 10 const int maxn=1e5+5; 11 int mid[50],pre[50]; 12 struct node 13 { 14 int data; 15 node *LNode; 16 node *RNode; 17 }; 18 node* build(int *mid,int *pre,int n) 19 { 20 if(n<=0)return NULL; 21 int *p=mid; 22 while(p) 23 { 24 if(*p==*pre) 25 break; 26 p++; 27 } 28 node *T=new node; 29 T->data=*p; 30 int len=p-mid; 31 T->LNode=build(mid,pre+1,len); 32 T->RNode=build(p+1,pre+len+1,n-len-1); 33 return T; 34 } 35 void cengprint(node *T) 36 { 37 queue<node*> q; 38 q.push(T); 39 int flag=0; 40 while(!q.empty()) 41 { 42 node *x=q.front(); 43 if(!flag) 44 printf("%d",x->data),flag++; 45 else 46 printf(" %d",x->data); 47 q.pop(); 48 if(x->RNode) 49 q.push(x->RNode); 50 if(x->LNode) 51 q.push(x->LNode); 52 53 } 54 } 55 int main() 56 { 57 int n; 58 cin>>n; 59 for(int i=0;i<n;i++) 60 scanf("%d",&mid[i]); 61 for(int i=0;i<n;i++) 62 scanf("%d",&pre[i]); 63 node *T; 64 T=build(mid,pre,n); 65 cengprint(T); 66 printf("\n"); 67 return 0; 68 }