天梯赛 L2-006 树的遍历(序列建树)

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

猜你喜欢

转载自www.cnblogs.com/yzm10/p/10498905.html