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

算法通关村——如何使用中序和后序来恢复一棵二叉树

通过序列构造二叉树

给出以下三个二叉树遍历的序列:

(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之间划分。

第一轮划分结果如下图 

image.png

第二轮

我们先看前序和中序的第一个数组
前序: 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

第二轮划分结果如下图

image.png

第三轮

 对 3 4 5 6 8 7 继续划分:

前序: 3 [4 5 6 8 7]

中序: 3 [4 8 6 7 5] 

第三轮划分结果如下图

image.png

第四轮

对 4 5 6 8 7 进行划分:

前序:4 [5 6  8 7]

中序:4 [ 8 6 7 5 ]

 第四轮划分结果如下图

image.png

第五轮

对 5 6 8 7 划分:

前序:5 [6 8 7]

中序:[8 6 7] 5

第六轮 

对 6 8 7 划分

前序:6 [ 8 7 ]

中序: [8] 6 [7]

至此,便可知左子树的树结构了。

左子树的树结构效果如下: 

image.png

左子树的复原结果如下

image.png

右子树复原

第一轮

由第一轮可知如下序列

前序: 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的右子树

左右子树复原结果如下 

image.png

中后序恢复二叉树

 通过中后序恢复二叉树与前中序唯一的不同就是:后续的最后一个是根节点,中序的处理和上述相同。所需序列如下:

(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的右子树

左子树复原结果如下 

image.png

右子树复原

右子树复原所需要的序列:

中序: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的右子树

左右子树复原结果如下 

image.png

由此可知,前中序和中后序恢复成 二叉树的过程有些不同,但是所需的步骤和结果都是一致的。

知道了序列是如何构造成二叉树之后,便可以将其使用代码实现了,代码实现在下次总结。 

相关文章:

算法通关村——如何使用中序和后序来恢复一棵二叉树

通过序列构造二叉树 给出以下三个二叉树遍历的序列: (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本不错的关于设计模式的资料&#xff…...

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上却是可以的&#xff0…...

数学建模学习(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 的稳定币池由于编译器的漏洞所以遭到攻击。具体因为重入锁功能的失效,所以黑客可以轻易发动重入攻击,即允许攻击者在单次交易中执行某…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...

中医有效性探讨

文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)​现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...

鸿蒙(HarmonyOS5)实现跳一跳小游戏

下面我将介绍如何使用鸿蒙的ArkUI框架,实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...

Canal环境搭建并实现和ES数据同步

作者:田超凡 日期:2025年6月7日 Canal安装,启动端口11111、8082: 安装canal-deployer服务端: https://github.com/alibaba/canal/releases/1.1.7/canal.deployer-1.1.7.tar.gz cd /opt/homebrew/etc mkdir canal…...

Copilot for Xcode (iOS的 AI辅助编程)

Copilot for Xcode 简介Copilot下载与安装 体验环境要求下载最新的安装包安装登录系统权限设置 AI辅助编程生成注释代码补全简单需求代码生成辅助编程行间代码生成注释联想 代码生成 总结 简介 尝试使用了Copilot,它能根据上下文补全代码,快速生成常用…...

数据挖掘是什么?数据挖掘技术有哪些?

目录 一、数据挖掘是什么 二、常见的数据挖掘技术 1. 关联规则挖掘 2. 分类算法 3. 聚类分析 4. 回归分析 三、数据挖掘的应用领域 1. 商业领域 2. 医疗领域 3. 金融领域 4. 其他领域 四、数据挖掘面临的挑战和未来趋势 1. 面临的挑战 2. 未来趋势 五、总结 数据…...

深入浅出JavaScript中的ArrayBuffer:二进制数据的“瑞士军刀”

深入浅出JavaScript中的ArrayBuffer:二进制数据的“瑞士军刀” 在JavaScript中,我们经常需要处理文本、数组、对象等数据类型。但当我们需要处理文件上传、图像处理、网络通信等场景时,单纯依赖字符串或数组就显得力不从心了。这时&#xff…...

ffmpeg(三):处理原始数据命令

FFmpeg 可以直接处理原始音频和视频数据(Raw PCM、YUV 等),常见场景包括: 将原始 YUV 图像编码为 H.264 视频将 PCM 音频编码为 AAC 或 MP3对原始音视频数据进行封装(如封装为 MP4、TS) 处理原始 YUV 视频…...

mcts蒙特卡洛模拟树思想

您这个观察非常敏锐,而且在很大程度上是正确的!您已经洞察到了MCTS算法在不同阶段的两种不同行为模式。我们来把这个关系理得更清楚一些,您的理解其实离真相只有一步之遥。 您说的“select是在二次选择的时候起作用”,这个观察非…...