5-10 树的遍历 (25分)
给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数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
#include<iostream> #include<cmath> #include<cstdio> #include<cstring> #include<string> #include<queue> #include<stack> #include<list> #include<algorithm> using namespace std; #define ms(a,b) memset(a,b,sizeof(a)) #define ll long long const int M=1e4+10; int i,j,m,k,n; int in[M]; int pro[M]; int leaf[M]; void f(int r,int st,int end,int leave) { if(st>end)return; int i=end; while(i>st&&in[i]!=pro[r])i--; leaf[leave]=pro[r]; f(r-1,i+1,end,2*leave+2); f(r-1-(end-i),st,i-1,2*leave+1); } int main() { cin>>n; for(i=0;i<n;i++)cin>>pro[i]; for(i=0;i<n;i++)cin>>in[i]; ms(leaf,0); f(n-1,0,n-1,0); queue<int>q; q.push(0); int flag=0; while(!q.empty()){ int t=q.front();q.pop(); if(flag)cout<<" "<<leaf[t]; else{flag=1;cout<<leaf[t];} if(leaf[2*t+1])q.push(2*t+1); if(leaf[2*t+2])q.push(2*t+2); } return 0; }