L2-011 玩转二叉树

#include <bits/stdc++.h>

using namespace std;

const int N = 10110;

struct Tree {
    int u, l, r;
}TNode[N];

int midorder[N], preorder[N];

int main() {
    int n;
    cin >> n;
    for (int i = 0; i < N; i++) TNode[i].u = -1;
    for (int i = 0; i < n; i++) {
        cin >> midorder[i];
    }
    for (int i = 0; i < n; i++) {
        cin >> preorder[i];
    }
    int pos = 0;
    function<void(int, int, int)> build = [&](int l, int r, int u) {
        if (l >= r) {
            TNode[u].u = -1;
            return;
        }
        int root = preorder[pos++];
        TNode[u].u = root;
        TNode[u].l = 2 * u;
        TNode[u].r = 2 * u + 1;
        int mid = find(midorder, midorder + r, root) - midorder;
        build(l, mid, 2 * u);
        build(mid + 1, r, 2 * u + 1);
    };

    build(0, n, 1);

    vector<int> res;

    queue<int> q;
    q.push(1);
    while (q.size()) {
        int u = q.front();
        q.pop();

        if (TNode[u].u != -1) {
            res.push_back(TNode[u].u);
            q.push(TNode[u].r);
            q.push(TNode[u].l);
        }
    }

    for (int i = 0; i < res.size(); i++) {
        cout << res[i] << " "[i == res.size() - 1];
    }

    return 0;
}
posted @ 2022-03-17 09:01  Xxaj5  阅读(33)  评论(0编辑  收藏  举报