CCCC練習 5-10樹的遍歷

給定一棵二叉樹的後序遍歷和中序遍歷,請你輸出其層序遍歷的序列。這裏假設鍵值都是互不相等的正整數。

輸入格式:

輸入第一行給出一個正整數NN\le 3030),是二叉樹中結點的個數。第二行給出其後序遍歷序列。第三行給出其中序遍歷序列。數字間以空格分隔。

輸出格式:

在一行中輸出該樹的層序遍歷的序列。數字間以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 <stdio.h>
#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;
}
}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章