算法通关村——如何使用中序和后序来恢复一棵二叉树
通过序列构造二叉树
给出以下三个二叉树遍历的序列:
(1) 前序: 1 2 3 4 5 6 8 7 9 10 11 12 13 15 14
(2) 中序: 3 4 8 6 7 5 2 1 10 9 11 15 13 14 12
(3) 后序: 8 7 6 5 4 3 2 10 15 14 13 12 11 9 1
前中序复原二叉树
所需序列
(1) 前序: 1 2 3 4 5 6 8 7 9 10 11 12 13 15 14
(2) 中序: 3 4 8 6 7 5 2 1 10 9 11 15 13 14 12
左子树复原
第一轮
通过前序: 前序第一个访问的是根节点,因此根节点就是1
通过中序:中序遍历的特点就是根节点的左子树的元素都在根节点的左侧,右子树的元素都在根节点的右侧,从中序遍历序列结合前序序列可知,中序序列1的左侧为左子树,1的右侧为右子树。从而前序通过中序划分可知,前序的左右子树。划分如下:
中序序列划分: [3 4 8 6 7 5 2] 1 [ 10 9 11 15 13 14 12]
前序序列划分: 1 [2 3 4 5 6 8 7 ] [9 10 11 12 13 15 14]
分析
如何知道两个括号从哪里分开?可参照中序的两个数组划分的。
前序中 7 之前的元素都在中序第一个数组中,9之后的所有元素都在第二个数组中,因此从7和9之间划分。
第一轮划分结果如下图

第二轮
我们先看前序和中序的第一个数组
前序: 2 3 4 5 6 8 7中序: 3 4 8 6 7 5 2
通过上面的结论可知:
根节点为2(前序)
然后可划分为:
前序: 2 [3 4 5 6 8 7 ]
中序: [3 4 8 6 7 5 ] 2
第二轮划分结果如下图

第三轮
对 3 4 5 6 8 7 继续划分:
前序: 3 [4 5 6 8 7]
中序: 3 [4 8 6 7 5]
第三轮划分结果如下图

第四轮
对 4 5 6 8 7 进行划分:
前序:4 [5 6 8 7]
中序:4 [ 8 6 7 5 ]
第四轮划分结果如下图

第五轮
对 5 6 8 7 划分:
前序:5 [6 8 7]
中序:[8 6 7] 5
第六轮
对 6 8 7 划分
前序:6 [ 8 7 ]
中序: [8] 6 [7]
至此,便可知左子树的树结构了。
左子树的树结构效果如下:

左子树的复原结果如下

右子树复原
第一轮
由第一轮可知如下序列
前序: 9 10 11 12 13 15 14
中序: 10 9 11 15 13 14 12
对其进行划分,结果如下
前序:9 [ 10 11 12 13 15 14]
中序:[10] 9 [11 15 13 14 12]
由结果可知,10 是 9 的左子树,11 15 13 14 12为还需划分的序列
第二轮
将序列11 12 13 15 14进行划分:
前序:11 [12 13 15 14]
中序:11 [15 13 14 12]
第三轮
将12 13 15 14进行划分:
前序:12[13 15 14]
中序: [15 13 14]12
第四轮
将 13 15 14进行划分:
前序:13 [ 15 14]
中序: [15] 13 [14]
最终由中序获得结果,15为13的左子树,14为13的右子树
左右子树复原结果如下

中后序恢复二叉树
通过中后序恢复二叉树与前中序唯一的不同就是:后续的最后一个是根节点,中序的处理和上述相同。所需序列如下:
(2) 中序: 3 4 8 6 7 5 2 1 10 9 11 15 13 14 12
(3) 后序: 8 7 6 5 4 3 2 10 15 14 13 12 11 9 1
左子树复原
第一轮
中序序列划分:[3 4 8 6 7 5 2] 1 [10 9 11 15 13 14 12]
后序序列划分:[8 7 6 5 4 3 2 ] [10 15 14 13 12 11 9 ]1
由于上述经过了上述分析,对划分结果有所了解了,因此此次划分就不画中间过程了
第二轮
对序列 8 7 6 5 4 3 2 进行划分
中序:[3 4 8 6 7 5 ] 2
后序:[8 7 6 5 4 3 ] 2
第三轮
对序列 8 7 6 5 4 3 进行划分:
中序:3[4 8 6 7 5]
后序:[8 7 6 5 4] 3
第四轮
对序列8 7 6 5 4进行划分:
中序:4 [8 6 7 5]
后序:[8 7 6 5] 4
第五轮
对序列8 7 6 5进行划分:
中序:[8 6 7 ] 5
后序:[8 7 6 ] 5
第六轮
对序列 8 7 6进行划分:
中序:[8] 6 [7]
后序:[8 7] 6
最终,由中序划分可知,8是6的左子树,7是6的右子树
左子树复原结果如下

右子树复原
右子树复原所需要的序列:
中序:10 9 11 15 13 14 12
后序:10 15 14 13 12 11 9
第一轮
将序列10 15 14 13 12 11 9进行划分(一般选择能确定根节点的那个节点):
中序:[10] 9 [11 15 13 14 12]
后序:[10 15 14 13 12 11] 9
由此划分可知,10为9的左节点,11 15 13 14 12为9的右子树
第二轮
对序列15 14 13 12 11进行划分:
中序:11 [15 13 14 12]
后序:[15 14 13 12] 11
第三轮
对序列15 14 13 12进行划分:
中序:[15 13 14] 12
后序:[15 14 13] 12
第四轮
对序列15 14 13 进行划分:
中序:[15] 13 [14]
后序:[15 14]13
从中序结果可知,15为13的左子树,14为13的右子树
左右子树复原结果如下

由此可知,前中序和中后序恢复成 二叉树的过程有些不同,但是所需的步骤和结果都是一致的。
知道了序列是如何构造成二叉树之后,便可以将其使用代码实现了,代码实现在下次总结。
相关文章:
算法通关村——如何使用中序和后序来恢复一棵二叉树
通过序列构造二叉树 给出以下三个二叉树遍历的序列: (1) 前序: 1 2 3 4 5 6 8 7 9 10 11 12 13 15 14 (2) 中序: 3 4 8 6 7 5 2 1 10 9 11 15 13 14 12 (3) 后序: 8 7 6 5 4 3 2 10 15 14 13 12 11 9 1 前中序复原二叉树 所需序列 (1) 前序: 1 2 3 4 5 6 8 7 9 10 …...
TypeScript的基本类型
typescript的定义 以JavaScript为基础构建的语言是js的超集可以在任何支持js的平台执行ts 拓展了js并增加了类型Ts不能被js解析器直接执行。 TS> 编译为js 执行的还是js. js 不易于维护,而ts易于维护。 可提高项目的可维护性。 类似less、sass 完善的语法写 样…...
Docker实战-如何去访问Docker仓库?
导语 仓库在之前的分享中我们介绍过,它主要的作用就是用来存放镜像文件,又可以分为是公共的仓库和私有仓库。有点类似于Maven的中央仓库和公司内部私服。 下面我们就来介绍一下在Docker中如何去访问各种仓库。 Docker Hub 公共镜像仓库 Docker Hub 是Docker官方提供的最…...
【力扣】722. 删除注释
以下为力扣官方题解,及本人代码 722. 删除注释 题目题意示例 1示例 2提示 官方题解模拟思路与算法复杂度 本人代码Java提交结果:通过 题目 题意 给一个 C C C 程序,删除程序中的注释。这个程序 s o u r c e source source 是一个数组&a…...
篇二:工厂方法模式:灵活创建对象
篇二:“工厂方法模式:灵活创建对象” 开始本篇文章之前先推荐一个好用的学习工具,AIRIght,借助于AI助手工具,学习事半功倍。欢迎访问:http://airight.fun/。 另外有2本不错的关于设计模式的资料ÿ…...
Python(六十二)字典元素的增、删、改操作
❤️ 专栏简介:本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中,我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 :本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…...
从零学算法138
**138.**给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节…...
CTF PWN练习之返回地址覆盖
今天进行的实验是CTF PWN练习之返回地址覆盖,来体验一下新的溢出方式。 学习地址覆盖之前还有些小知识需要掌握,不然做题的时候你肯定一脸懵逼,首先是函数调用约定,然后还要知道基本的缓冲区溢出攻击模型。 函数调用约定 函数调用约定描述…...
OpenCV中图像变换
一、介绍 transform():Transposes a matrix. perspectiveTransform():Performs the perspective matrix transformation of vectors. warpAffine():Applies an affine transformation to an image. warpPerspective():Applies a p…...
wordpress发表文章时报错: rest_cannot_create,抱歉,您不能为此用户创建文章(已解决)
使用wordpress 的rest api发布文章,首先使用wp-json/jwt-auth/v1/token接口获取token,然后再使用/wp-json/wp/v2/posts 接口发表文章,但是使用axios请求时,却报错: 但是,我在postman上却是可以的࿰…...
数学建模学习(7):Matlab绘图
一、二维图像绘制 1.绘制曲线图 最基础的二维图形绘制方法:plot -plot命令自动打开一个图形窗口Figure; 用直线连接相邻两数据点来绘制图形 -根据图形坐标大小自动缩扩坐标轴,将数据标尺及单位标注自动加到两个坐标轴上,可自定…...
CSS中所有选择器详解
文章目录 一、基础选择器1.标签选择器2.类选择器3.id选择器4.通配符选择器 二、复合选择器1.交集选择器2.并集选择器 三、属性选择器1.[属性]2.[属性属性值]3.[属性^属性值]4.[属性$属性值]5.[属性*属性值] 四、关系选择器1.父亲>儿子2.祖先 后代3.兄弟4.兄~弟 五、伪类选择…...
STM32 低功耗学习
STM32 电源系统结构介绍 电源系统:VDDA供电区域、VDD供电区域、1.8V供电区域、后备供电区域。 器件的工作电压(VDD)2.0~3.6V 为了提高转换精度,给模拟外设独立供电。电压调节器为1.8V供电区域供电,且1.8V供电区域是电…...
HCIP--云计算题库 V5.0版本
在国家政策的支持下,我国云计算应用市场发展明显加快,越来越多的企业开始介入云产业,出现了大量的应用解决方案,云应用的成功案例逐渐丰富,用户了解和认可程度不断提高,云计算产业发展迎来了“黄金机遇期”…...
小白到运维工程师自学之路 第六十五集 (docker-compose)
一、概述 Docker Compose 的前身是 Fig,它是一个定义及运行多个 Docker 容器的工具。可以使用YAML文件来配置应用程序的服务。然后,使用单个命令,您可以创建并启动配置中的所有服务。Docker Compose 会通过解析容器间的依赖关系(…...
量子机器学习
量子机器学习(QML)是结合量子计算和机器学习的交叉领域,旨在利用量子计算的优势来改进机器学习算法的性能。下面是一些有关量子机器学习的学习资源和技术应用: 学术论文和研究资料: ArXiv.org:在ArXiv的量子物理和机器学习类别中&…...
WEB集群——tomcat
1. 简述静态网页和动态网页的区别。 2. 简述 Webl.0 和 Web2.0 的区别。 3. 安装tomcat8,配置服务启动脚本,部署jpress应用。 一、简述静态网页和动态网页的区别 (1)静态网页 1.什么是静态网页 请求响应信息,发…...
Vulnhub: blogger:1靶机
kali:192.168.111.111 靶机:192.168.111.176 信息收集 端口扫描 nmap -A -sC -v -sV -T5 -p- --scripthttp-enum 192.168.111.176 在80端口的/assets/fonts/目录下发现blog目录,访问后发现为wordpress 利用wpscan发现wordpress插件wpdisc…...
老版MFC工程迁移到VC2019编译EXE太大的问题
有个老版静态链接MFC库的MFC程序需要迁移到VC2019编译,直接用VC2019打开就会自动迁移过去,然后编译一下,生成的EXE大小将近3MB,老版的工程编译出来也就600多KB。 肯定哪里不对劲! 好一顿研究之后发现原来默认会把MFC…...
Curve深陷安全事件,OKLink如何破局
出品|欧科云链研究院 作者|Matthew Lee 7月31号,Curve 在平台表示 Vyper 0.2.15 的稳定币池由于编译器的漏洞所以遭到攻击。具体因为重入锁功能的失效,所以黑客可以轻易发动重入攻击,即允许攻击者在单次交易中执行某…...
从气象数据到地图可视化:用ArcGIS克里金插值模型构建全流程
从气象数据到地图可视化:用ArcGIS克里金插值模型构建全流程 气象数据在环境监测、农业规划等领域扮演着关键角色。当我们面对分散的气象站点数据时,如何将其转化为连续的空间分布图?克里金插值法作为地统计学中的经典方法,能够有效…...
【AIAgent元学习能力解码】:SITS2026首席科学家亲授3大突破性架构与落地路径
第一章:AIAgent元学习能力的范式跃迁 2026奇点智能技术大会(https://ml-summit.org) 传统AI代理依赖于静态任务对齐与预设策略库,而新一代AIAgent正突破这一边界,将元学习(Meta-Learning)内化为可泛化、可演化的运行…...
告别重复炼丹!用Iris框架5分钟搞定新器官分割,一个例子就教会AI
医学影像分割新范式:5分钟零样本适配罕见解剖结构的实战指南 当你在深夜的实验室收到一份从未见过的胰腺肿瘤CT序列,或是临床合作方突然提出要分割某种尚未标注的罕见血管变异时,传统深度学习流程的笨重感会瞬间袭来——收集样本、标注数据、…...
别再只抄电路图了!手把手教你用RC复位电路,从电容选型到时间计算(附常见坑点)
从零构建可靠复位电路:RC参数设计与避坑指南 当你第一次翻开单片机开发板的原理图,那个看似简单的RC复位电路背后,其实隐藏着一整套精妙的电子学原理。很多初学者会直接照搬现成电路,却不知道不同的电容类型会导致系统稳定性天差地…...
《智能体应用交付实操:OpenClaw+Skills+RAG+Agent智能体应用案例实操和智能体交付的方案设计》
《智能体应用交付实操:OpenClawSkillsRAGAgent智能体应用案例实操和智能体交付的方案设计》大模型算法实战专家—周红伟老师 曾任阿里人工智能专家/曾任马上消费金融风控负责人课程背景随着大语言模型技术的爆发式发展,智能体(Agentÿ…...
3分钟学会:免费下载B站大会员4K视频的完整教程
3分钟学会:免费下载B站大会员4K视频的完整教程 【免费下载链接】bilibili-downloader B站视频下载,支持下载大会员清晰度4K,持续更新中 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-downloader 还在为B站视频无法离线观看…...
Rust的迭代器适配器与消费者在流式处理中的零拷贝设计
Rust的迭代器适配器与消费者在流式处理中的零拷贝设计,是现代高性能编程中的关键技术。通过迭代器链的组合与惰性求值,Rust能够在处理数据流时避免不必要的内存复制,显著提升性能。这种设计尤其适用于网络协议解析、文件处理等场景࿰…...
告别字幕烦恼:B站CC字幕下载转换终极指南
告别字幕烦恼:B站CC字幕下载转换终极指南 【免费下载链接】BiliBiliCCSubtitle 一个用于下载B站(哔哩哔哩)CC字幕及转换的工具; 项目地址: https://gitcode.com/gh_mirrors/bi/BiliBiliCCSubtitle 还在为无法保存B站视频字幕而苦恼吗?想要将精彩的…...
别再盲目调参了!折叠共源共栅放大器设计的几个关键陷阱与性能权衡(以1GHz带宽为例)
折叠共源共栅放大器设计的深度避坑指南:从1GHz带宽实战看性能平衡艺术 在模拟电路设计的浩瀚海洋中,折叠共源共栅(Folded Cascode)放大器犹如一把双刃剑——它既能提供出色的增益和带宽性能,又可能在细微的参数调整中让…...
企业级AI自动化平台深度解析:Midscene.js完整部署方案与最佳实践
企业级AI自动化平台深度解析:Midscene.js完整部署方案与最佳实践 【免费下载链接】midscene AI-powered, vision-driven UI automation for every platform. 项目地址: https://gitcode.com/GitHub_Trending/mid/midscene Midscene.js是一款基于视觉语言模型…...
