力扣(LeetCode)106. 从中序与后序遍历序列构造二叉树(C++)

news2025/1/14 19:27:17

递归

构造二叉树
如图,后序序列按照左右根遍历,所以根在最后。逆着后序遍历的顺序,按照根右左递归建树就可以复原这棵树。后序序列,可以确定根的位置 p o s t r o o t postroot postroot 和根结点的值。我们在中序序列找到根结点的值,就确定了根在中序序列的位置 i n r o o t inroot inroot 。那么, i n r o o t − 1 inroot-1 inroot1 往左就是左子树 , i n r o o t + 1 inroot+1 inroot+1 往右就是右子树 , 这是由于中序按照左根右顺序遍历。
我们按照根右左的顺序,递归建树即可。

  • 细节补充

建立哈希表,预处理中序序列的结点值对应到下标。这样就可以 O ( 1 ) O(1) O(1) 的从后序根结点值找到中序根结点下标了。
递归结束条件是建树的左右下标大小颠倒。

代码展示

class Solution {
private:
    unordered_map<int,int> mp;
    int postroot;
public:
    TreeNode* dfs(int inleft,int inright,vector<int> &inorder,vector<int> &postorder){
        if(inleft>inright) return NULL;
        // TreeNode *root = (TreeNode*)calloc(1,sizeof(TreeNode));
        // 力扣 delete 这棵树,对应 new , 不能calloc。
        int root_val = postorder[postroot--];
        TreeNode *root = new TreeNode(root_val);
        root->right = dfs(mp[root->val]+1,inright,inorder,postorder);
        root->left = dfs(inleft,mp[root->val]-1,inorder,postorder);
        return root;
    }
    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
        postroot = (int)postorder.size()-1;
        int idx = 0;
        for(auto &x:inorder) mp[x] = idx++;
        return dfs(0,postroot,inorder,postorder);
    }
};

博主致语

理解思路很重要!
欢迎读者在评论区留言,作为日更博主,看到就会回复的。

AC

ac

复杂度分析

  1. 时间复杂度: O ( n ) O(n) O(n) n n n i n o r d e r 、 p o s t o r d e r inorder、postorder inorderpostorder 的长度。递归建树的时间复杂度是 O ( n ) O(n) O(n)
  2. 空间复杂度: O ( n ) O(n) O(n),递归的最坏深度是 O ( n ) O(n) O(n) ,平均深度 O ( l o g n ) O(logn) O(logn)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/10575.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《深度学习进阶 自然语言处理》第四章:Embedding层和负采样介绍

文章目录4.1 word2vec的改进一4.1.1 Embedding层4.2 word2vec的改进二4.2.1 中间层之后的计算问题4.2.2 从多分类到二分类4.2.3 负采样总结之前文章链接&#xff1a; 开篇介绍&#xff1a;《深度学习进阶 自然语言处理》书籍介绍 第一章&#xff1a;《深度学习进阶 自然语言处…

想知道有没有拍照转文字的软件?这3款工具职场人士必备

你们在工作上有没有遇到这种情况&#xff0c;就是领导突然甩一份纸质文件给你&#xff0c;并要求整理成电子版&#xff0c;供其他同事查阅。回想我当初刚踏入职场时&#xff0c;没有什么工作经验&#xff0c;只会对照着内容手动码字输出&#xff0c;但是太浪费时间了&#xff0…

湖北银行冲刺上市:不良率高于行业均值,有公司欠5亿元未能追回

撰稿|汤汤 来源|贝多财经 最近&#xff0c;湖北银行正式向A股递交申请材料&#xff0c;准备在上海证券交易所上市。 据贝多财经了解&#xff0c;湖北银行股份有限公司&#xff08;下称“湖北银行”&#xff09;于2022年11月4日在证监会预披露招股书&#xff0c;计划在上交所…

Azide-PEG-Aldehyde,N3-PEG-ALD,叠氮-PEG-醛基可用于新材料研究

化学试剂叠氮-聚乙二醇-醛基&#xff0c;其英文名为Azide-PEG-Aldehyde&#xff08;N3-PEG-ALD&#xff09;&#xff0c;它所属分类为Aldehyde / Acetal PEG Azide PEG。 peg试剂的分子量均可定制&#xff0c;有&#xff1a;5000 N3-PEG-ALD、10000 叠氮-PEG-醛基、1000 N3-PE…

短视频社交|电影点播平台Springboot+vue+ElementUI前后端分离

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容&#xff1a;Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助 收藏点赞不迷路 关注作者有好处 文末获取源…

SpringMVC 请求流程源码分析

三哥 内容来自【自学星球】 欢迎大家来了解我的星球&#xff0c;和星主&#xff08;也就是我&#xff09;一起学习 Java &#xff0c;深入 Java 体系中的所有技术。我给自己定的时间是一年&#xff0c;无论结果如何&#xff0c;必定能给星球中的各位带来点东西。 想要了解更多&…

使用robot+selenium创建一个UI自动化测试用例

新建项目并安装robotframework pip install robotframework 在pycharm-插件&#xff0c;输入robot搜索插件 选择Robot Framework Language Server或者Hyper RobotFramework Support安装 新建test.robot文件编写测试用例test.robot robot用例文件通常包括4个头部分&#xf…

Substance Painter 的一些玩法笔记

Substance Painter 的一些玩法 1、模型边缘磨损效果&#xff1a; 参考连接&#xff1a;Substance Painter 后期添加法线贴图&#xff0c;处理边缘磨损&#xff01;_哔哩哔哩_bilibili 使用方法&#xff1a; 1、导入要处理的模型文件 2、烘焙 模型贴图(主要是法线) 3、创建一个…

接口api 之Swagger 一次实战探索

今天我们来说说什么是Swagger&#xff1f; 就是把相关的信息存储在它定义的描述文件里面&#xff08;yml或json格式&#xff09;&#xff0c;再通过维护这个描述文件可以去更新接口文档&#xff0c;以及生成各端代码。而Springfox-swagger,则可以通过扫描代码去生成这个描述文…

自学CFD:我在实习岗速成无人机设计和仿真的故事

一、写在前面 大家好&#xff0c;我叫Jack&#xff08;硕士在读&#xff09;&#xff0c;目前在企业实践学习。 作为一名门外汉&#xff0c;初识计算流体力学&#xff0c;经历了盲目无措、乱做一气&#xff0c;查资料找经验毫无进展&#xff0c;直到从B站遇到了Graychen老师。…

综合布线工程测试技术

一、测试的相关基础知识 综合布线工程测试内容主要包括三个方面:工作区到设备间的连通状况测试、主干线连通状况测试、跳线测试。 每项测试内容主要测试以下参数:信息传输速率、衰减、距离、接线图、近端串扰等。 1、接线图(Wire Map) 接线图是用来检验每根电缆末端…

24、四大函数式接口(有函数型接口和断定型接口(都是函数式接口))

四大函数式接口&#xff08;有函数型接口和断定型接口&#xff08;都是函数式接口&#xff09;&#xff09; 新时代程序员&#xff1a;lambda表达式&#xff0c;链式编程&#xff0c;函数式接口&#xff0c;Stream流式计算 函数式接口&#xff1a;只有一个抽象方法的接口&…

热门Java开发工具IDEA入门指南——从Eclipse迁移到IntelliJ IDEA(二)

IntelliJ IDEA&#xff0c;是java编程语言开发的集成环境。IntelliJ在业界被公认为最好的java开发工具&#xff0c;尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能是非常强大的。 本文…

HTML非遗文化网页设计题材【京剧文化】HTML+CSS(大美中国 14页 带bootstarp)

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 茶文化网站 | 中华传统文化题材 | 京剧文化水墨风书画 | 中国民间年画文化艺术网站 | 等网站的设计与制作 | HTML期末大学生网页设计作业&#xff0c;…

Publisher/Subscriber 订阅-发布模式原理解析

Publisher/Subscriber 订阅-发布模式原理解析 参考资料 What Is Pub/Sub? Publish/Subscribe Messaging Explained什么是serverless&#xff1f;Pub/Sub Examples: 5 Use Cases to Understand the Pattern and its BenefitsJavaScript 设计模式精讲Avro Schema格式 一、概念…

【视觉高级篇】21 # 如何添加相机,用透视原理对物体进行投影?

说明 【跟月影学可视化】学习笔记。 如何理解相机和视图矩阵&#xff1f; 用一个三维坐标&#xff08;Position&#xff09;和一个三维向量方向&#xff08;LookAt Target&#xff09;来表示 WebGL 的三维世界的一个相机。要绘制以相机为观察者的图形&#xff0c;需要用一个…

ubuntu安装和启动redis命令步骤及其配置文件redis.conf

1、步骤一 依次执行如下命令 1.下载&#xff1a;wget http://download.redis.io/releases/redis-6.0.1.tar.gz 2.解压&#xff1a;tar xzf redis-6.0.1.tar.gz 2.将解压文件夹移动到usr/local/redis目录下:sudo mv ./redis-6.0.1 /usr/local/redis/ 4.进入到redis目录&#x…

这或许是全网最全时间序列特征工程构造的文章了

数据和特征决定了机器学习的上限&#xff0c;而模型和算法只是逼近这个上限而已。由此可见&#xff0c;特征工程在机器学习中占有相当重要的地位。在实际应用当中&#xff0c;可以说特征工程是机器学习成功的关键。 那特征工程是什么&#xff1f; 特征工程是利用数据领域的相关…

饼图、柱形图、堆积柱、折线图、散点图,到底应该怎么选?

“随着数字经济的发展&#xff0c;各行业的数据都出现了爆炸式的增长&#xff0c;如何快速从海量数据中提取出有效信息&#xff0c;最大化地挖掘数据价值&#xff0c;是所有转型的企业都在面临的问题。” 想要快速直观地以易于理解、内容简单的方式了解相关数据&#xff0c;就需…

[附源码]java毕业设计家政管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…