当前位置: 首页 > news >正文

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

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

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

相关文章:

  • 前端小食堂 | Day15 - VueUse 魔法道具库
  • 【NLP 40、残差神经网络】
  • Windows下安装MongoDB 8
  • 【数据分析】读取文档(读取Excel)
  • Flux 文生图技术解析与部署实践
  • Python 魔法方法介绍
  • 网络安全常识科普(百问百答)
  • 每日Attention学习26——Dynamic Weighted Feature Fusion
  • 双指针算法专题之——有效三角形的个数
  • 《Python深度学习》第二讲:深度学习的数学基础
  • 老牌软件,方便处理图片,量大管饱。
  • 4大观点直面呈现|直播回顾-DeepSeek时代的AI算力管理
  • 《灵珠觉醒:从零到算法金仙的C++修炼》卷三·天劫试炼(35)山河社稷图展开 - 编辑距离(字符串DP)
  • 向量数据库技术系列二-Milvus介绍
  • 【linux篇】--linux常见指令
  • 简单爬虫--框架
  • [蓝桥杯 2023 省 A] 买瓜 --暴力DFS+剪枝优化
  • L1-078 吉老师的回归(C++)
  • 202503执行jmeter压测数据库(ScyllaDB,redis,lindorm,Mysql)
  • 前缀和的例题
  • 网站建设 全网推广/北京seo诊断
  • 域名怎么做网站内容/谷歌搜索引擎优化
  • 做网站公司名字应该用图片吗/我想做app推广代理
  • flash网站建设价格/郑州seo使用教程
  • 网站毕业设计答辩问题/谷歌推广方案
  • dw网站的站点建设/常用的seo查询工具