欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

玩转二叉树

程序员文章站 2022-05-17 07:54:06
...

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

输入格式:

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