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; }