树的遍历

给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。

输入格式:

输入第一行给出一个正整数N(≤),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。

输出格式:

在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。

输入样例:

7
2 3 1 5 7 6 4
1 2 3 4 5 6 7

输出样例:

4 1 6 3 5 7 2
#include <bits/stdc++.h>
using namespace std;
#define maxn 335
int n ;
int lod[maxn];
int mod[maxn];
int cnt = 0;

struct node
{
    int l;
    int r;
    int v;
    node (): l(0) , r(0) {}
};
node data[maxn];

int dfs(int la[],int mo[], int len)
{

    if( len <= 0 )return -1;
    int k = 0;
    for(int i = 0 ; i < len ; ++i) {
        if( la[len-1] == mo[i] ){
            k = i;
            break;
        }
    }
    int rt = cnt++;
    data[rt].v = mo[k];
    data[rt].l = dfs(la,mo,k);
    data[rt].r = dfs(la+k,mo+k+1,len-k-1);
    return rt;
}

int main()
{
    cin >> n;
    for(int i = 0 ; i < n ; ++i)
        scanf("%d",&lod[i]);
    for(int i = 0 ; i < n ; ++i)
        scanf("%d",&mod[i]);
    int rt = dfs(lod,mod,n);

    queue<int>q;
    q.push(rt);
    bool first = 1;
    while (!q.empty())
    {
        int fr = q.front(); q.pop();
        if (data[fr].l != -1) q.push(data[fr].l);
        if (data[fr].r != -1) q.push(data[fr].r);
        if (first) { first = 0; }
        else printf(" ");
        printf("%d", data[fr].v);
    }
    printf("\n");
    return 0;
}

 

posted @ 2019-02-19 02:20  shengge777  阅读(150)  评论(0编辑  收藏  举报