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
#include<bits/stdc++.h>
using namespace std;

const int maxn = 30;
int a[maxn + 10], b[maxn + 10];
map<int, int>L, R;

int build(int la, int ra, int lb, int rb) {
    if (la > ra)
        return 0;

    int root = a[ra];
    int i;

    for (i = lb; i <= rb && b[i] != root; i++) {;}

    if (i <= rb) {
        R[root] = build(ra - rb + i, ra - 1, i + 1, rb);
        L[root] = build(la, ra - rb + i - 1, lb, i - 1);
    }

    return root;
}

void bfs(int root) {
    queue<int> Q;
    Q.push(root);

    int cnt = 0;

    while (!Q.empty()) {
        int tn = Q.front();
        Q.pop();
        printf(cnt++ == 0 ? "%d" : " %d", tn);

        if (L[tn])
            Q.push(L[tn]);

        if (R[tn])
            Q.push(R[tn]);
    }

    puts("");
}

int main() {
    int N;
    scanf("%d", &N);

    for (int i = 1; i <= N; i++)
        scanf("%d", &a[i]);

    for (int i = 1; i <= N; i++)
        scanf("%d", &b[i]);

    int root = build(1, N, 1, N);
    bfs(root);
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章