根据前或后遍历和中序遍历建立二叉树

根据前或后遍历和中序遍历建立二叉树

不是最优解法,但只是原创的,记录一下省的忘

#include <bits/stdc++.h>
#include <limits.h>
#include <math.h>
#include <memory.h>
#include <stdio.h>

#include <algorithm>
#include <iostream>
#include <map>
#include <queue>
#include <stack>
#include <string>
#include <vector>
using namespace std;
#define ms(x, n) memset(x, n, sizeof(x))
#define wht() \
    int _;    \
    for (scanf("%d", &_); _; _--)
#define For(i, a, b) for (int i = a; i <= (b); i++)
#define Rof(i, a, b) for (int i = a; i >= (b); i--)
#define ioss ios::sync_with_stdio(false)
#define all(a) a.begin(), a.end()
#define int long long
#define input(x) scanf("%lld", &x);
#define print(x) printf("%lld", x);
#define println(x, flag) \
    printf("%lld", x);   \
    printf(!flag ? "\n" : " ");
typedef vector<int> vi;
typedef pair<int, int> pii;

const int maxn = 2e6 + 7;
const int maxm = 5e3 + 7;
const int MOD = 1e9 + 7;
const int mod = 998244353;

int min(int a, int b) { return a < b ? a : b; }
int max(int a, int b) { return a > b ? a : b; }
int gcd(int a, int b) { return b ? gcd(b, a % b) : a; }
bool cmp(int a, int b) { return a > b; }

struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode() : val(0), left(nullptr), right(nullptr) {}
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
    TreeNode(int x, TreeNode *left, TreeNode *right)
        : val(x), left(left), right(right) {}
};

const int N = 30 + 5;
int n, m, k;
int f[N], g[N];

void build(TreeNode *&r, int val, int le, int ri) {
    if (r == nullptr) {
        r = new TreeNode;
        r->val = val;
        r->left = r->right = nullptr;
        return;
    }
    int u = -1, v = -1;
    For(i, le, ri) {
        if (g[i] == val) u = i;
        if (g[i] == r->val) v = i;
    }
    // cout << u << " " << v << "\n";
    if (u > v)
        build(r->right, val, v + 1, ri);
    else
        build(r->left, val, le, v - 1);
}

vector<int> pre;
void predfs(TreeNode *r) {
    if (r == nullptr) return;
    pre.push_back(r->val);
    predfs(r->left);
    predfs(r->right);
}

int p[N], tot;

vector<int> bfs;
void Bfs(TreeNode *r) {
    queue<TreeNode *> q;
    q.push(r);
    while (!q.empty()) {
        TreeNode *cur = q.front();
        q.pop();
        bfs.push_back(cur->val);
        if (cur->left != nullptr) q.push(cur->left);
        if (cur->right != nullptr) q.push(cur->right);
    }
}

void work() {
    cin >> n;
    For(i, 1, n) { cin >> f[i]; }
    int u = -1;
    For(i, 1, n) {
        cin >> g[i];
        if (g[i] == f[n]) {
            u = i;
        }
    }
    // cout << u << "\n";
    TreeNode *root = nullptr;
    Rof(i, n, 1) { build(root, f[i], 1, n); }
    Bfs(root);
    int fir = 0;
    for (auto x : bfs) {
        if (fir) cout << " ";
        fir = 1;
        cout << x;
    }
}

signed main() {
#ifndef ONLINE_JUDGE
    freopen("test.in", "r", stdin);
    freopen("test.out", "w", stdout);
#endif
    work();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值