剑指 Offer 07. 重建二叉树

Paho Asynchronous MQTT C Client Library--MQTTAsync API 异步MQTT 客户端库for C 阅读详情

题目

输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。

假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

首先根据前序和中序构建二叉树 ,前序和后序不能创建唯一的二叉树。

思路:

前序遍历的第一个元素就是他的头节点。知道了头节点,我们可以在中序遍历中找到头节点的位置index。知道了这些信息我们就可以求出来左子树在数组中的长度: index - inStart。(inStart 是中序遍历的起点)。

实现步骤:

  • 获取树的跟节点

  1. int val = preorder[preStart] (preStart是前序遍历的起始值)。然后我们直接构建二叉树 TreeNode* root = new TreeNode(val)。

  • 构建左树:root->left

  1. 我们知道该二叉树的左子树的长度为 int leftSize = index - inStart; 所以我们可以推出二叉树的左子树在前序遍历的位置是[preStart + 1,preStart + leftSize]。同理:二叉树的左子树在中序遍历的位置是 [inStart , index - 1] (inStart是前序遍历的起始值)。

  • 构建右树:root->right

  1. 二叉树的右子树在前序遍历的位置是 [preStart + leftSize + 1,preEnd]。同理:二叉树右子树在中序遍历的位置是 [index + 1 , inoEnd]。

#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <numeric>
#include <set>

using namespace std;

// Definition for a binary tree node.
struct TreeNode {
   int val;
   TreeNode *left;
   TreeNode *right;
   TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

 // 根据前序和中序构建二叉树 (前序和后序不能创建唯一的二叉树)
class Solution {
private:
  // 方法2 (优化了执行时间)
  // 映射中序遍历,更快找到根节点
  unordered_map<int, int> inorderMap;
public:
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
      return build(preorder, inorder, 0, preorder.size() - 1, 0, inorder.size() - 1);
    }
    TreeNode* build(vector<int>& preorder, vector<int>& inorder, int preStart,
      int preEnd, int inStart, int inEnd){
        // 结束条件
        if(preStart > preEnd || inStart > inEnd) return nullptr;
        // 找到根节点
        int rootVal = preorder[preStart];
        TreeNode *root = new TreeNode(rootVal);
        // 根节点在中序中的位置
        int rootIndex = 0;
        for(int i = 0; i <= inEnd; i++){
          if(inorder[i] == rootVal){
            rootIndex = i;
            break;
          }
        }
        // 左子树长度
        int leftSize = rootIndex - inStart;
        // 递归
        root->left = build(preorder, inorder, preStart + 1, preStart + leftSize,
                      inStart, rootIndex - 1);
        root->right = build(preorder, inorder, preStart + leftSize + 1, preEnd,
                      rootIndex + 1, inEnd);
        return root;
    }
};

void preorderTraverse(TreeNode *root){
  if(root != nullptr){
    cout << root->val << ", " ;
    preorderTraverse(root->left);
    preorderTraverse(root->right);
  }
}

int main(){
  vector<int> preorder = {3,9,20,15,7};
  vector<int> inorder = {9,3,15,20,7};
  Solution sol;
  TreeNode* root = sol.buildTree(preorder, inorder);
  preorderTraverse(root);
  cout << endl;
}
三菱FX5U通信之CCLINK操作步骤 11. 连接 CC‐Link 用的端子排,连接 Ver.1.10 对应 CC‐Link 专用电缆。备注:1、以上对应的寄存器都是一一对应的,主站的点数可以比从站多,但是都需要一一对应起来。3.直接安装孔,用于直接安装的螺钉孔(2‐φ4.5,安装螺钉为 M4 螺钉)2.点阵 LED(显示模块中设置的站号和测试模式的内容)5.次段扩展连接器(连接扩展模块的扩展电缆的连接器)4.动作状态(显示 LED 显示模块的动作状态)10 电源连接器,用于连接电源电缆的连接器。1.扩展电缆(扩展时连接用的电缆) 阅读详情

相关推荐

EDA与机器学习融合:智能优化芯片设计流程的工程实践

机器学习作为数据驱动的核心技术,通过从历史数据中学习复杂模式,实现对系统行为的预测与优化。其原理在于构建模型,将输入特征映射到目标变量,从而揭示数据背后的内在规律。在工程领域,这项技术的核心价值在于能够将专家经验转化为可量化、可复用的智能模型,显著提升自动化水平与决策效率。电子设计自动化(EDA)是芯片设计的关键支撑,传统流程高度依赖人工试错,面临参数空间巨大、优化周期长等挑战。将机器学习应用于EDA,能够构建预测模型来预估设计性能(PPA),或通过代理模型加速设计空间探索,实现智能化的设计辅助与优化。本文

weixin_30411239的博客 684

剑指offer 07.重建二叉树

第三部分是右子树,从根节点(in_root+1)->中序遍历的末位置(inorder.size()-1)依据前序遍历可以找到根节点root就是前序遍历的首位置,依据根节点可以将中序遍历切割为三部分。前序右子树的根节点(pre_root+in_root-in_left+1)第一部分是根节点,根据前序根节点的值找到中序根节点(in_root)第二部分是左子树,从中序遍历的首位置->根节点(in_root-1)使用哈希表可以很快的依据前序的根节点找到中序的根节点的索引。前序左子树的根节点(pre_root+1)

qq_53002662的博客 155

别再只用线性回归了!用sklearn的核岭回归搞定非线性数据(附RBF核调参实战)

本文详细介绍了如何使用sklearn的核岭回归处理非线性数据,特别是RBF核的应用与调参实战。通过网格搜索找到最佳参数组合,核岭回归能有效捕捉数据中的复杂波动,显著提升模型性能。适合需要解决非线性问题的数据科学家和机器学习工程师。

weixin_34246529的博客 336

剑指offer面试题7:重建二叉树

剑指offer面试题7:重建二叉树

Adward的博客 497

gsplat在windows本地部署

3DGS的cuda提效和优化内存的版本gsplat,使得在有一定GPU计算能力的电脑上也能够尝尝3DGS的效果。我在2025年的开年之初尝试配置过gsplat,由于过程中遇到很多问题,最终还是有一些windows上字符编码的问题,没有跑通,最近看gsplat的github更新了3DGUT,优化了反射和二次折射,以及适用于非线性相机模型,如鱼眼相机等。在data目录下下载好了360_v2的数据,进入之后images文件夹是原始分辨率的图像,images_2是下采样系数为2的数据,以此类推。

yuleaf_csdn的博客 2367

kbjdbc: autodetected server-encoding to be ISO-8859-1, if the message is not readable, please check

这条信息是来自 KingbaseES 数据库的一个 JDBC 客户端连接提示。KingbaseES 是一个企业级的关系型数据库管理系统,它兼容 PostgreSQL 的许多特性。如果上述步骤仍然无法解决问题,建议详细查看数据库和客户端的日志文件,以获取更具体的错误信息。此外,也可以考虑联系 KingbaseES 的技术支持获取帮助。项目融合kingbase数据库,输出日志乱码。结果:网上各种调整各种试。

zjy660358的专栏 4842

18. 重建二叉树

输入一棵二叉树前序遍历和中序遍历的结果,请重建该二叉树。 注意: 二叉树中每个节点的值都互不相同; 输入的前序遍历和中序遍历一定合法; 样例 给定: 前序遍历是:[3, 9, 20, 15, 7] 中序遍历是:[9, 3, 15, 20, 7] 返回:[3, 9, 20, null, null, 15, 7, null, null, null, null] 返回的二叉树如下所示: 3 / 9 20 / 15 7 在这里插入代码片 /** * Definition for a binary

qq_45638271的博客 696

Hadoop在大数据领域的电商数据分析案例

随着电商行业的迅猛发展,每天都会产生海量的数据,如用户浏览记录、购买行为、商品信息等。如何从这些数据中提取有价值的信息,为电商企业的决策提供支持,成为了电商企业面临的重要问题。Hadoop作为一个开源的分布式计算平台,具有高可靠性、高扩展性和高效性等特点,能够很好地处理大数据。本文的目的就是通过实际案例,详细介绍Hadoop在电商数据分析中的应用,范围涵盖了从数据采集、存储到分析的整个流程。本文首先介绍背景信息,让读者了解Hadoop在电商数据分析中的重要性和应用场景。

Java大师兄的博客 1177

【剑指offer07】【C++】重建二叉树

【剑指offer07】【C++】重建二叉树题目题解 题目 输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3 / \ 9 20 / \ 15 7 限制: 0 <= 节点个数 <= 5000 题解 笔记: 递归思想,最

程序员阿浪 307

【人工智能之深度学习】12. BERT微调实战:医疗文本分类的领域自适应技巧与工业级实现

摘要:医疗文本分类是自然语言处理在医疗健康领域的核心应用,可辅助疾病诊断、病历结构化和医疗质量监控。然而,医疗文本的专业术语密集、实体关系复杂及数据长尾分布等特性,导致通用BERT模型性能受限。本文系统阐述医疗文本分类的领域自适应技术,从理论原理到工业级实现展开全流程讲解。首先分析医疗文本的独特属性及技术挑战;随后详解领域继续预训练、适配器微调、对抗训练等核心技术的数学原理;构建包含数据预处理、模型优化、隐私保护的完整实战架构;通过疾病分类、情感分析、事件检测三大案例验证技术有效性。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1003

ARM功耗管理软件之DVFS&AVS

思考:功耗管理软件栈及示例?WFI&WFE?时钟&电源树?DVFS&AVS?

AI-安全-功耗 1230

剑指 Offer 07. 重建二叉树 javaScript解决

剑指 Offer 07. 重建二叉树问题描述代码注意事项 问题描述 输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3 / 9 20 / 15 7 代码 var buildTree = function(preorder, inorder) { if( !preorder.len

ryyzxf的博客 251

YOLO11优化:TGRS2026 CKConv结合C3k2 | 方向特征与跨阶段融合协同,小目标漏检率大幅下降

多尺度适配小目标尺寸变化:在 C3k2 不同阶段配置 CKConv 不同核尺度(浅层小核捕获精细纹理,深层大核聚合上下文),兼顾局部细节与全局感知,提升对舰船、车辆等小尺寸目标及红外热目标的检测鲁棒性。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 563

剑指Offer07.重建二叉树 c++

剑指Offer07.重建二叉树 写在前面,小白从零刷题,在解答会写出思路,正确答案,以及所有使用到的语法和知识点 1.递归和hashmap 1 递归和hashmap class Solution { private: unordered_map<int, int> index; public: TreeNode* myBuildTree(const vector<int>& preorder, const vector<int>&

y152543654的博客 242

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

LeetCode 之 剑指 Offer 07. 重建二叉树(Java)

LeetCode 之 剑指 Offer 07. 重建二叉树(Java),输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。本文简单描述解题思路,如何重新划分前序遍历和中序遍历的二叉树根节点、左右子树,并提供实现代码。

渣渣的夏天 616

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

剑指 Offer 07. 重建二叉树(递归)

剑指 Offer 07. 重建二叉树 输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3 / 9 20 / 15 7 题解:用递归找中序的位置。 /** * Definition for a binary tree node. * struct TreeNode { *

城南的花 275

【leetcode】【medium】剑指 Offer 07. 重建二叉树​​​​​​​

剑指 Offer 07. 重建二叉树 输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 例如,给出 前序遍历 preorder =[3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3 / \ 9 20 / \ 15 7 限制: 0 <= 节点个数 <= 5000 注意:本题与主站 105 题重复:https://le.

lemonade13的博客 175

剑指offer 07. 重建二叉树

剑指offer 07. 重建二叉树 题目描述 解题思路 细节: 在中序遍历中对根节点进行定位时,一种简单的方法是直接扫描整个中序遍历的结果并找出根节点,但这样做的时间复杂度较高。我们可以考虑使用哈希表来帮助我们快速地定位根节点。 对于哈希映射中的每个键值对,键表示一个元素(节点的值),值表示其在中序遍历中的出现位置。在构造二叉树的过程之前,我们可以对中序遍历的列表进行一遍扫描,就可以构造出这个哈希映射。在此后构造二叉树的过程中,我们就只需要 O(1)的时间对根节点进行定位了。 /** * Definit

Charison的编程妙妙屋 132

算法练习- LeetCode 剑指 Offer 07. 重建二叉树

算法练习- LeetCode 剑指 Offer 07. 重建二叉树

qq_41758969的博客 223

剑指 Offer 07. 重建二叉树(中等)

剑指 Offer 07. 重建二叉树 输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 例如,给出 前序遍历 preorder =[3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3 / \ 9 20 / \ 15 7 限制: 0 <= 节点个数 <= 5000 我的Java代码: 思路:给的函数接口直接...

VictorKa的博客 177
上一篇: C++重点归纳
下一篇: 配置Azure Kinect DK/Kinect
LearnToStick
博客等级 码龄9年 11粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值