1. 程式人生 > >天梯賽 L2-006 樹的遍歷(序列建樹)

天梯賽 L2-006 樹的遍歷(序列建樹)

math bfs uil 一個 names def 代碼 整數 std

L2-006 樹的遍歷 (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
作者: 陳越 單位: 浙江大學 時間限制: 400 ms 內存限制: 64 MB 代碼長度限制: 16 KB 根據給定序列建出二叉樹,然後進行層序遍歷。
#include<bits/stdc++.h>
#define
MAX 125 using namespace std; struct Node{ //二叉樹建立 int x,l,r; }tree[MAX]; int h[MAX],z[MAX]; int c; int find(int h[],int z[],int len){ //找中序的父節點 for(int i=0;i<len;i++){ if(z[i]==h[len-1]){ return i; } } } int build(int h[],int z[],int len){ //
建樹 if(len<=0) return -1; int k=find(h,z,len); c++; int f=c; tree[f].x=z[k]; tree[f].l=build(h,z,k); tree[f].r=build(h+k,z+(k+1),len-(k+1)); return f; } void bfs(int x){ //層序遍歷 int f=0,i; queue<int> q; q.push(x); while(q.size()){
int x=tree[q.front()].x; int l=tree[q.front()].l; int r=tree[q.front()].r; if(f==0) f=1; else printf(" "); printf("%d",x); if(l>-1) q.push(l); if(r>-1) q.push(r); q.pop(); } } int main() { int n,i,j; scanf("%d",&n); for(i=0;i<n;i++){ scanf("%d",&h[i]); } for(i=0;i<n;i++){ scanf("%d",&z[i]); } c=0; build(h,z,n); bfs(1); return 0; }

天梯賽 L2-006 樹的遍歷(序列建樹)