玩转二叉树

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

输入格式:

输入第一行给出一个正整数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 }

 

posted @ 2018-11-09 15:14  甘雨说晚安吗  阅读(364)  评论(0编辑  收藏  举报
/* 点击爆炸效果*/
/* 鼠标点击求赞文字特效 */ /*鼠标跟随效果*/