重建二叉树

二叉树的重建 在http://blog.youkuaiyun.com/hacker_zhidian/article/details/60586445这篇文章中我们看了一下二叉树的四种遍历方式,接下来我们看一下关于二叉树的重建问题,什么叫二叉树的重建呢?比方说给你一棵二叉树的前序遍历顺序和中序遍历顺序,要求你求出这颗二叉树的后序遍历顺序。来看一下个具体的例题数据,给定一个二叉树的信息:二叉树节点数: 5 前序遍历顺序:1 2 阅读详情

重建二叉树

输入一棵二叉树前序遍历和中序遍历的结果,请重建该二叉树。

注意 :

  • 二叉树中每个节点的值都互不相同;
  • 输入的前序遍历和中序遍历一定合法;

数据范围

树中节点数量范围[0,100][0,100][0,100]。

样例

给定:
前序遍历是:[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

算法

(递归)O(n)O(n)O(n)

递归建立整棵二叉树:先递归创建左右子树,然后创建根节点,并让指针指向两棵子树。

具体步骤如下:

  1. 先利用前序遍历找根节点:前序遍历的第一个数,就是根节点的值;
  2. 在中序遍历中找到当前根节点的位置 kkk ,则 kkk 左边是左子树的中序遍历``,右边是右子树的中序遍历;
  3. 假设左子树的中序遍历的长度是 lll ,则在前序遍历中,根节点后面的 lll 个数,是左子树的前序遍历,剩下的数是右子树的前序遍历;
  4. 有了左右子树的前序遍历和中序遍历,我们可以先递归创建出左右子树,然后再创建根节点;

时间复杂度分析

初始化时,用哈希表(unordered_map<int, int>)记录每个值在中序遍历的位置,这样我们在递归到每个节点时,在中序遍历中查找根节点的位置的操作,只需要 O(1)O(1)O(1) 的时间。此时,创建每个节点需要的时间是 O(1)O(1)O(1) ,所以总时间复杂度是 O(n)O(n)O(n)。

变量说明

  • pos:记录每个节点在中序遍历序列中的位置。
  • pre: 题目输入数据,表示当前二叉树的前序遍历序列。
  • in: 题目输入数据,表示当前二叉树的中序遍历序列。
  • k: 表示当前根节点在所给中序遍历序列中的位置(分割左右子树)。
  • pl:表示当前根节点所代表的树在前序遍历序列中对应范围的起始位置。
  • pr:表示当前根节点所代表的树在前序遍历序列中对应范围的终点位置。
  • il:表示当前根节点所代表的树在中序遍历序列中对应范围的起始位置。
  • ir:表示当前根节点所代表的树在中序遍历序列中对应范围的终点位置。
/**
 * 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 {
public:
    // 记录每个点在中序遍历序列中的位置
    unordered_map<int, int> pos;
    
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        int n = preorder.size();
        for (int i = 0; i < n; i ++ )
             pos[inorder[i]] = i;
        return dfs(preorder, inorder, 0, n - 1, 0, n - 1);
    }
    
    // DFS递归遍历二叉树
    TreeNode* dfs(vector<int>& pre, vector<int>& in, int pl, int pr, int il, int ir) {
        if (pl > pr) return NULL;
        int k = pos[pre[pl]]; // 当前根节点在中序遍历序列中所在的位置
        TreeNode* root = new TreeNode(pre[pl]);
        root->left = dfs(pre, in, pl + 1, pl + k - il, il, k - 1);
        root->right = dfs(pre, in, pl + k + 1 -il, pr, k + 1, ir);
        return root;
    }
};
NYOJ--重建二叉树 二叉树遍历,先序和中序重建二叉树,后序和中序重建二叉树等 阅读详情

相关推荐

Python:重建二叉树

牛客网上的剑指 offer的在线编程: 题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 # -*- coding:utf-8 -*- ''' 重建二叉树 题目描述 输入某二叉树的

Lynette_bb的博客 3951

【算法专题】重建二叉树

重建二叉树总结 概述 重建二叉树分为三种类型: (1)中序遍历+前序遍历/后序遍历 重建二叉树; (2)中序遍历+层序遍历 重建二叉树; (3)前序遍历+给定叶节点 重建二叉树。 下面分别给出这三类重建二叉树的讲解。 类型一:中序+前序/后序 AcWing 1631. 后序遍历 问题描述 问题链接:AcWing 1631. 后序遍历 分析 对于给定前序遍历的区间[pl, pr]和中序遍历的区间[il, ir],则待构造的树的根节点为preorder[pl],

weixin_42638946的博客 5182

基于IC动态加权的机器学习多因子选股策略:从模型融合到实战回测

在量化投资领域,多因子选股模型通过挖掘市场数据中的有效信号来预测股票收益。其核心原理在于利用统计学与机器学习算法,从海量因子中识别出与未来收益具有稳定相关性的特征。这一技术的核心价值在于将主观投资决策转化为系统化、可重复的客观过程,从而在控制风险的前提下追求超额收益。其典型应用场景包括股票阿尔法策略构建、Smart Beta产品设计以及资产配置中的股票筛选环节。本文聚焦于如何通过信息系数(IC)这一关键指标,动态融合Ridge回归、MLP神经网络和随机森林等多个预测模型,构建一个能够自适应市场风格轮动的选股

weixin_34216614的博客 451

手把手教你如何重建二叉树(超精彩配图)

手把手教你如何重建二叉树(超精彩配图)

TrueDei 5709

2025.06.25【微生物】|Emu工具安装与使用详解:全长16S扩增子微生物丰度分析

Emu是一款基于贝叶斯方法的微生物多样性分析工具,专为处理高错误率的长读长16S/18S扩增子数据优化。本文详细介绍了Emu的安装与使用方法:1)通过conda创建独立环境并安装Emu;2)提供SILVA等预构建数据库的下载指南,并说明自定义数据库的构建方法;3)演示单样本和多样本分析流程,解读关键输出文件;4)介绍丰度表合并、分类等级汇总等实用功能扩展;5)建议后续分析方向。文章还附有官方GitHub链接和相关文献资源,为微生物群落结构研究提供了一套完整的分析解决方案。

1256

欧姆龙OMRON PLC之HostLink通讯协议(四)-FINS命令进阶应用与调试技巧

本文深入探讨欧姆龙OMRON PLC的HostLink通讯协议中FINS命令的进阶应用与调试技巧。文章聚焦实战排错,详细解析命令帧解剖、响应帧解读与网络抓包三大核心方法,并分享性能优化策略,如合并读写与异步设计。同时介绍了强制操作、多存储区访问等高级命令的应用场景,旨在帮助工程师高效解决现场通讯问题,提升系统稳定性与效率。

nept的博客 751

二叉树经典问题——已知中序和前序重建二叉树

运用前序和中序序列重建二叉树及其相关应用重建过程 1,在二叉树的学习中经常会遇到一类问题,就是给出一棵二叉树的前序和中序序列(后序和中序类似)然后求树的深度、树的后序序列、树的各种遍历等等问题,这个时候如果能根据相关的序列把其代表的二叉树重建出来,那么所有的问题便会迎刃而解。博文的第一部分就给出相关的重建步骤。 2,重建中最关键的一点是从前序中找根然后在后序中用相应的根把树‘分解’。举个例子:

razorEdge的博客 1万+

注意力机制详解

注意力机制详解Attention机制由来Attention定义Encoder-Decoder框架存在问题:Attenion机制的引入Attention机制的类别Hard AttentionSoft AttentionGlobal AttentionLocal AttentionSelf AttentionMulti-head Attention附录—Transformer全局视角Tensor视角Encoder部分Self-AttentionSelf-Attention向量计算Self-Attention的矩

weixin_43236310的博客 1万+

数据结构:关于重建二叉树的三种思路

前言: 前几天在温习《编程之美》这本书的时候,看到了二叉树的重建。正好,也想复习一下数据结构的知识,就来写了一个小Demo。居然有新发现(本文中的第三种方式)。 我们在学习数据结构的时候,肯定可以很轻松地编写对二叉树的三种遍历过程。分别是前序、中序和后序遍历。 这里要说的不是对二叉树遍历,而是要通过一些遍历过程来重建一棵二叉树。比例,告诉你有一棵二叉树前序遍历的结果为:A...

weixin_30378311的博客 1079

基于YOLOv11的手写数字与符号识别系统设计与实现

手写数字与符号识别系统需要丰富多样的训练数据才能达到理想的泛化性能。MNIST:包含70,000个手写数字样本(0-9),28x28灰度图像优点:干净整齐,适合初学者缺点:多样性不足,只有数字EMNIST:MNIST的扩展,包含数字、字母(大小写)和特殊符号样本量:814,255张图像覆盖62个类别(10数字+26小写字母+26大写字母)HASYv2:专门的手写符号数据集包含369个不同符号类别约168,000个标注实例包括数学符号、箭头、括号等:英文手写文本数据库。

YOLO 292

OpenClaw 安装失败:npm install 多次报错的完整排错与解决方案

这次问题的最终解决,其实并不复杂,但关键在于思路的转变:从“脚本怎么又失败了”,切换为“npm 在这一层到底失败在哪里”。当我们手动复现安装过程、打开 verbose 日志、直面真实错误栈时,问题就不再是模糊的“安装不了”,而是一个可以被定位、被验证、被修复的具体工程问题。

博客 1万+

二叉树——重建二叉树

二叉树——重建二叉树 例如,某二叉树为: 前序遍历为:(4,7,9,2,1,5,6) 中序遍历为:(7,9,4,1,2,6,5) 后序遍历为:(9,7,1,6,5,2,4) 1.前序遍历+中序遍历 =&amp;gt; 重建二叉树 输入某二叉树的前序遍历和中序遍历的结果,重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 代码 #include &amp;lt;iostream&amp;gt; #in...

hh66__66hh的博客 3800

Qt基础之十九:进程与QProcess

进程就是一个程序的执行实例,也就是正在运行的程序。对操作系统来说,进程就是一个担当分配系统资源CPU时间、内存的实体。在Qt 中,我们使用QProcess来表示一个进程。这个类可以允许我们的应用程序启动一个新的外部程序,并且与这个程序进行通讯。当外部程序开始启动时,QProcess的状态为Starting;外部程序已经启动时,QProcess的状态为Running,并发送started()信号;当外部层序退出了,QProcess的状态为NotRunning(初始状态),并发送finished()信号。

草上爬的博客 1万+

二叉树重建

二叉树重建系列二叉树重建根据不同遍历的序列重建根据数组或者链表重建 二叉树重建 二叉树重建的关键思想是递归重建。 根据不同遍历的序列重建 从前序与中序遍历序列中重建二叉树(LeetCode 105) 题目描述: 分析:前序遍历是每次先遍历根节点,在遍历左子树和右子树。因此前序遍历序列的第一个元素就是根节点,然后递归建立左右子树。 代码: class Solution { public: TreeNode* generate(vector<int>& preorder,int

l_s_2020的博客 274

华为OD面试手撕真题目录

2026最新华为OD面试手撕真题 , 提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解.

qq_45776114的博客 1万+

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

二叉树重建(根据后序中序重建二叉树)

1:根据二叉树的后续序列和中序序列可以确定唯一的二叉树; 2:二叉树遍历顺序       前序遍历;根节点-->左子树-->右子树;    中序遍历:左子树-->根节点-->右子树;    后序遍历:左子树-->右子树-->根节点; 下面重建二叉树之后再层序遍历 #include #include #include int post[31],in[31]; int m,ele

计科菜鸟的天地. 1553

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

重建二叉树-JAVA实现

重建二叉树-JAVA实现二叉树的遍历方式题目描述实现流程代码实现拓展 二叉树的遍历方式 二叉树的遍历方式分为前序遍历,中序遍历,后序遍历; 具体相关概念请参考博客:二叉树的先序、中序、后序遍历序列 题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。(该题引自剑指offer经典例题) 实现流程 根据前序遍历和中序遍历

ldzn 284

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

重建二叉树 python_重建二叉树

题目:输入某二叉树的前序遍历黑夜中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历中都不包含重复的数字。例如输入前序遍历序列{1, 2, 4, 7, 3, 5, 6, 8}和中序遍历 {4, 7, 2, 1, 5, 3, 8, 6},则重建出该二叉树。C#实现:publicclassBinaryTreeNode{intvalue;BinaryTreeNodeleft;Binar...

weixin_39908616的博客 75

由中根序列和后根序列重建二叉树_二叉树的重建

重建二叉树引言问题:现有二叉树的后序遍历序列与中序遍历序列,能否求原二叉树?答案是肯定的,并且前序与中序也可以得到原二叉树。本文就如何使用这两种序列组合如何重建二叉树进行讨论。首先,定义二叉树的遍历。二叉树的遍历对于一个二叉树的遍历,有以下原则:- 遇到一个根节点,先访问左节点,再访问右节点而前,后,中序遍历分别指根节点在访问左右节点之前,之间,之后。如何重建?那么根据二叉树遍历的定义,对一个最简...

weixin_39528366的博客 1054
上一篇: 日期问题常用模板>.<(简单日期问题一网打尽)...
下一篇: LeetCode 1. 两数之和
屑屑_
博客等级 码龄6年 19粉丝 43原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值