給定一棵二叉樹的後序遍歷和中序遍歷,請你輸出其層序遍歷的序列。這裏假設鍵值都是互不相等的正整數。
輸入格式:
輸入第一行給出一個正整數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
- 時間限制:400ms
- 內存限制:64MB
- 代碼長度限制:16kB
- 判題程序:系統默認
- 作者:陳越
- 單位:浙江大學
#include <iostream>
#include <vector>
using namespace std;
vector<int> post,in,level(10000,-1);
//根由中序序列中計算得到,start是前序序列的查找開始,end是前序序列的查找末尾
void pre(int root,int start,int end,int index){
int i;
if(start > end) return;
i = start;
while(in[i]!=post[root] && i<end)
i++;
level[index] = post[root];
pre(root-1-end+i,start,i-1,index*2+1);//左子樹
pre(root-1,i+1,end,2*index+2);//右子樹
}
int main(){
int n;
scanf("%d",&n);
post.resize(n);
in.resize(n);
for(int i=0;i<n;i++)
scanf("%d",&post[i]);
for(int i=0;i<n;i++)
scanf("%d",&in[i]);
pre(n-1,0,n-1,0);
int cnt=0;
for(int i=0;i<level.size();i++){
if(level[i]!=-1 && cnt!=n-1){
printf("%d ",level[i]);
cnt++;
}
else if(level[i]!=-1){
printf("%d\n",level[i]);
break;
}
}
}