L2-006. 树的遍历

给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。

输入格式:

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

输出格式:

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

输入样例:

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

输出样例:

4 1 6 3 5 7 2

思路:通过后序和中序遍历建树,然后在层序遍历。其中,用递归建树,用BFS遍历,不算难。

 

 

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 int L[100]={-1};
 5 int R[100]={-1};
 6 int a[100];
 7 int b[100];
 8 int cal(int al,int ar,int bl,int br)
 9 {
10     if(al>ar) return -1;
11     int root=a[ar];
12     int i=bl;
13     while(i<=br&&b[i]!=root) i++;
14     L[root]=cal(al,al+i-bl-1,bl,i-1);
15     R[root]=cal(ar-br+i,ar-1,i+1,br);
16     return root;
17 }
18 
19 void BFS(int root)
20 {
21     queue<int> q;
22     q.push(root);
23     int flag=1;
24     while(!q.empty())
25     {
26         int x=q.front();
27         if(flag)
28         {
29             cout<<x;
30             flag=0;
31         }
32         else cout<<" "<<x;
33         q.pop();
34         if(L[x]!=-1) q.push(L[x]);
35         if(R[x]!=-1) q.push(R[x]);
36     }
37 }
38 
39 int main()
40 {
41     int n;
42     cin>>n;
43     for(int i=0;i<n;i++) cin>>a[i];
44     for(int i=0;i<n;i++) cin>>b[i];
45     int root=cal(0,n-1,0,n-1);
46     BFS(root);
47     return 0;
48 }

 

posted @ 2018-03-27 20:01  magicalzh  阅读(185)  评论(0编辑  收藏  举报