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

 

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