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

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage)&#xff1a…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

Caliper 负载(Workload)详细解析

Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...

群晖NAS如何在虚拟机创建飞牛NAS

套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...

9-Oracle 23 ai Vector Search 特性 知识准备

很多小伙伴是不是参加了 免费认证课程&#xff08;限时至2025/5/15&#xff09; Oracle AI Vector Search 1Z0-184-25考试&#xff0c;都顺利拿到certified了没。 各行各业的AI 大模型的到来&#xff0c;传统的数据库中的SQL还能不能打&#xff0c;结构化和非结构的话数据如何和…...