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 }