算法——层序遍历和中序遍历构造二叉树

晴问 通过中序遍历判断左右子树,接着从层序遍历中,把左子树的层序遍历和右子树的层序遍历提取出来

cpp 复制代码
#include <bits/stdc++.h>

using namespace std;

vector<int> in, cc;

struct treeNode {
    int data;
    treeNode *left;
    treeNode *right;

    treeNode(int data) : data(data), left(nullptr), right(nullptr) {}
};


treeNode *dfs(treeNode *&root, vector<int> &level, int in_left, int in_right) {
    if (level.size() == 0) return nullptr;
    int curRootNum = level[0], rootInIndex;
    for (rootInIndex = in_left; rootInIndex <= in_right; ++rootInIndex) {
        if (in[rootInIndex] == curRootNum) break;
    }

    root = new treeNode(curRootNum);

    set<int> leftTree;
    for (int i = in_left; i < rootInIndex; ++i) {
        leftTree.insert(in[i]);
    }

    vector<int> level_left, level_right;
    for (int i = 0; i < level.size(); ++i) {
        if (level[i] == curRootNum) continue;
        if (leftTree.find(level[i]) != leftTree.end()) {
            level_left.push_back(level[i]);
        } else {
            level_right.push_back(level[i]);
        }
    }

    dfs(root->left, level_left, in_left, rootInIndex - 1);
    dfs(root->right, level_right, rootInIndex + 1, in_right);

    return root;
}

vector<int> result;

void preOrder(treeNode *root) {
    if (root == nullptr) return;

    result.push_back(root->data);
    preOrder(root->left);
    preOrder(root->right);
}

int main() {

    int n;
    cin >> n;
    for (int i = 0; i < n; ++i) {
        int num;
        cin >> num;
        cc.push_back(num);
    }
    for (int i = 0; i < n; ++i) {
        int num;
        cin >> num;
        in.push_back(num);
    }

    treeNode *root;
    dfs(root, cc, 0, n - 1);

    preOrder(root);

    for (int i = 0; i < result.size(); ++i) {
        cout << result[i];
        if (i != result.size() - 1) cout << " ";
    }
    return 0;
}
相关推荐
A尘埃2 小时前
超市购物篮关联分析与货架优化(Apriori算法)
算法
.小墨迹2 小时前
apollo学习之借道超车的速度规划
linux·c++·学习·算法·ubuntu
数智工坊2 小时前
【数据结构-树与二叉树】4.3 二叉树的存储结构
数据结构
独好紫罗兰2 小时前
对python的再认识-基于数据结构进行-a004-列表-实用事务
开发语言·数据结构·python
不穿格子的程序员2 小时前
从零开始刷算法——贪心篇1:跳跃游戏1 + 跳跃游戏2
算法·游戏·贪心
大江东去浪淘尽千古风流人物2 小时前
【SLAM新范式】几何主导=》几何+学习+语义+高效表示的融合
深度学习·算法·slam
铉铉这波能秀2 小时前
LeetCode Hot100数据结构背景知识之列表(List)Python2026新版
数据结构·leetcode·list
重生之我是Java开发战士3 小时前
【优选算法】模拟算法:替换所有的问号,提莫攻击,N字形变换,外观数列,数青蛙
算法
仟濹3 小时前
算法打卡 day1 (2026-02-06 周四) | 算法: DFS | 1_卡码网98 可达路径 | 2_力扣797_所有可能的路径
算法·leetcode·深度优先
yang)3 小时前
欠采样时的相位倒置问题
算法