【数据结构(邓俊辉)学习笔记】二叉树03——重构

0 .概述

介绍下二叉树重构

1. 遍历序列

任何一棵二叉树我们都可以导出先序、中序、后序遍历序列。这三个序列的长度相同,他们都是由树中的所有节点依照相应的遍历策略所确定的次序,依次排列而成。

若已知某棵树的遍历序列是否可以忠实地还原出这棵树地拓扑结构?什么情况下可以?什么情况下不可以?如果可以,具体又应该使用什么方法?

2. 先序 | 后序 + 中序

结论:只需中序遍历序列再加上先序与后序遍历序列之一,即可忠实还原二叉树地完整拓扑结构。
在这里插入图片描述
对于上述结论做证明,为此需要做数学归纳

假设对于规模小于N地所有二叉树这个规律都是成立的,接下来考虑规模恰好为N的二叉树。
不失一般性,可以将二叉树画成上图所示的样子。
先序遍历序列:r L R
中序遍历序列:L r R
因此根据先序遍历可以明确树根节点是谁,进而可以在中序遍历序列中对这个节点进行定位。这个定位非常重要,它使我们得以确认左子树所对应的中序遍历子序列,以及右子树所对应的中序遍历子序列。也就是说我们可以知道左子树和右子树分别是由哪些节点组成。因此只要这两个遍历序列是合法的,反过来在先序遍历序列中就可以很容易地将左子树和右子树所对应地遍历子序列切分开。
  ~  
这样成功地将原来全树地重构问题,化解为两棵子树地重构问题。不难看出,这两棵子树在规模上都符合归纳假设,也就是它们都严格地小于N,因此根据归纳假设无论是左子树还是右子树的确都可以如此重构出来。

注意:无论是左子树还是右子树都有可能是空树,这种情况下树的规模应该是0。

不借助中序遍历序列,而只凭借先序和后序遍历序列,是否也能保证完成对左右子树地正确切分呢?答案是不能保证的。

原因是无论L 还是R都有可能是空树,比如右子树是空的,那么它对应的遍历:
先序遍历序列 r L
后序遍历序列 L r
反过来若左子树是空的,那么它对应的遍历:
先序遍历序列 r R
后序遍历序列 R r
可以看到这里出现了歧义,我们无法根据先序遍历序列以及后序遍历序列来区分在这种情况下,除去根节点之后的部分究竟是左子树还是右子树。

3. [先序 + 后序 ] x 真

在这里插入图片描述
由先序和后序遍历序列的确也可以还原树的整体结构。比如对于所谓的真二叉树就是这样。
所谓的真二叉树,其中每个节点的度数都必须是偶数,确切说是除了0就是2度,而1度节点是严格禁止的。因此非退化的真二叉树模式无非如上图。注意,此时的左子树和右子树要么同时为空要么同时非空,前一种情况显而易见,因此不妨假设他们都存在。于是这棵树的遍历先序遍历序列和后序遍历序列如下。
在这里插入图片描述
左子树的树根节点 l 在先序遍历序列中必然名列第二,位置是确定的,因此反过来,在任何给定的先序遍历序列中都可以便捷地找到它,进而在后序遍历序列中对它进行定位。这个节点在它所属地这棵子树地后序遍历子序列中必然垫后。这就意味着可以明确地界定左右子树范围。即左子树由哪些节点构成,右子树由哪些节点构成都是可以确定的。当然对称的,在后序遍历序列中,右子树的树根位置也是确定的,因此通过右子树的树根节点依然可以反过来在先序遍历序列中进行定位,而且同样地可以确定,左右子树地切分位置。
在这里插入图片描述
通过上述描述确实可以进行分而治之,从而通过递归的形式,完整地重构出一棵真二叉树。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

27【Aseprite 作图】盆栽——拆解

1 橘子画法拆解 (1)浅色3 1 0;深色0 2 3 就可以构成一个橘子 (2)浅色 2 1;深色1 0 (小个橘子) (3)浅色 2 1 0;深色1 2 3 2 树根部分 (1)底部画一条横线 (2)上一行 左空2 右空1 【代表底部重心先在右】 (3)再上一行,左空1,右空1 (4)再上一行,左突出1,…

粤嵌—2024/5/23—不同路径 ||(✔)

代码实现&#xff1a; int uniquePathsWithObstacles(int **obstacleGrid, int obstacleGridSize, int *obstacleGridColSize) {int x obstacleGridSize, y obstacleGridColSize[0];int dp[x][y];memset(dp, 0, sizeof(int) * x * y);for (int j 0; j < y && obs…

5.26机器人基础-空间描述和变换-总结

非目录 方便我找 重点 逆解 位姿矩阵的几何意义 实际坐标需要除以比例因子才能得到 比例因子的好处&#xff1a;在计算机的储存更加简单方便&#xff0c;例如x,y,x原先很大时&#xff0c;等比例改变 位姿坐标的齐次变换&#xff1a;左乘齐次坐标 从端点到末端&#xff0c…

重大活动网络安全保障建设及运营指南

在当今高度数字化的社会中&#xff0c;各类重大活动如会议、展览、赛事及庆典等正面临着日益复杂和严峻的网络安全威胁。这些威胁不限于网络入侵或数据泄露&#xff0c;更涉及到对基础设施、关键信息系统和公众舆论的复杂攻击&#xff0c;需要国际社会的密切合作和长期关注。因…

云计算和大数据处理

文章目录 1.云计算基础知识1.1 基本概念1.2 云计算分类 2.大数据处理基础知识2.1 基础知识2.3 大数据处理技术 1.云计算基础知识 1.1 基本概念 云计算是一种提供资源的网络&#xff0c;使用者可以随时获取“云”上的资源&#xff0c;按需求量使用&#xff0c;并且可以看成是无…

[LLM]从GPT-4o原理到下一代人机交互技术

一 定义 GPT-4o作为OpenAI推出的一款多模态大型语言模型&#xff0c;代表了这一交互技术的重要发展方向。 GPT-4o是OpenAI推出的最新旗舰级人工智能模型&#xff0c;它是GPT系列的一个重要升级&#xff0c;其中的"o"代表"Omni"&#xff0c;中文意思是“全…

高光谱成像技术简介,怎么选择成像方案?

目录 一、什么是光谱&#xff1f;二、光谱和光谱分析方法的类型三、多光谱和高光谱的区别四、高光谱在水果品质检测中的应用1. 高光谱成像系统2. 高光谱图像的获取方式3. 高光谱图像处理与分析4. 在水果品质检测中的应用总结 五、针对自己的应用场景怎么使用高光谱技术六、参考…

C++标准库中string的底层实现方式

对于C中 std::string 的一些基本功能和用法&#xff0c;我们应该都很熟悉。但它底层到底是如何实现的呢? 其实在 std::string 的历史中&#xff0c;出现过几种不同的方式。下面我们来一一揭晓。 我们可以从一个简单的问题来探索&#xff0c;一个 std::string 对象占据的内存空…

java 拦截器-用户无操作超时退出利用Redis

1、授权过滤&#xff0c;只要实现AuthConfigAdapter接口 2、利用Redis token超时时间&#xff0c;用户访问后台续时 效果 Component public class AuthFilter implements Filter {private static Logger logger LoggerFactory.getLogger(AuthFilter.class);Autowiredprivat…

【Docker学习】深入研究命令docker exec

使用docker的过程中&#xff0c;我们会有多重情况需要访问容器。比如希望直接进入MySql容器执行命令&#xff0c;或是希望查看容器环境&#xff0c;进行某些操作或访问。这时就会用到这个命令&#xff1a;docker exec。 命令&#xff1a; docker container exec 描述&#x…

SAP FS00如何导出会计总账科目表

输入T-code : S_ALR_87012333 根据‘FS00’中找到的总账科目&#xff0c;进行筛选执行 点击左上角的列表菜单&#xff0c;选择‘电子表格’导出即可

spiderfoot一键扫描IP信息(KALI工具系列九)

目录 1、KALI LINUX简介 2、spiderfoot工具简介 3、在KALI中使用spiderfoot 3.1 目标主机IP&#xff08;win&#xff09; 3.2 KALI的IP 4、命令示例 4.1 web访问 4.2 扫描并进行DNS解析 4.3 全面扫描 5、总结 1、KALI LINUX简介 Kali Linux 是一个功能强大、多才多…

vcpkg环境配置

vcpkg 使用linux相关库&#xff0c;设置环境变量VCPKG_ROOT&#xff0c;设置cmake工具链$VCPKG_ROOT/scripts\buildsystems\vcpkg.cmake set VCPKG_DEFAULT_TRIPLETx64-windows .\vcpkg.exe install fftw3 freetype gettext glibmm gtkmm libjpeg-turbo libpng libxmlpp libs…

2010-2022年各省新质生产力数据(含原始数据+测算代码+计算结果)

2010-2022年各省新质生产力数据&#xff08;含原始数据测算代码计算结果&#xff09; 1、时间&#xff1a;2010-2022年 2、范围&#xff1a;31省 3、指标&#xff1a;gdp&#xff08;亿元&#xff09;、在岗职工工资&#xff1a;元、第三产业就业比重、人均受教育平均年限、…

变分自动编码器(VAE)深入理解与总结

本文导航 0 引言1 起源1.1 自编码器的任务定义1.2 自编码器存在的问题1.3 VAE的核心思路 2 VAE的建模过程2.1 VAE的任务定义2.2 真实分布 ϕ \phi ϕ是什么&#xff0c;为什么要逼近这个分布的参数&#xff0c;如何做&#xff1f;2.3 “重参数化&#xff08;Reparameterization…

TransFormer学习之VIT算法解析

1.算法简介 本文主要对VIT算法原理进行简单梳理&#xff0c;下图是一个大佬整理的网络整体的流程图&#xff0c;清晰明了&#xff0c;其实再了解自注意力机制和多头自注意力机制后&#xff0c;再看VIT就很简单了 受到NLP领域中Transformer成功应用的启发&#xff0c;ViT算法尝…

设计模式深度解析:分布式与中心化,IT界两大巨头“华山论剑”

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》《MYSQL应用》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 ✨IT界的两大巨头交锋✨ &#x1f44b; 在IT界的广阔天地中&#xff0c;有两座…

Qt 界面上控件自适应窗体大小 - 随窗体缩放

Qt 界面上控件自适应窗体大小 - 随窗体缩放 引言一、在Qt Designer上设置二、参数详解三、参考链接 引言 添加布局&#xff0c;设置控件的minimumSize、maximumSize和sizePolicy可以使其跟随窗体进行自适应缩放 - 如上图所示。 一、在Qt Designer上设置 在代码中设置效果一致…

c语言:模拟strlen(三种方法)最全版本

1.计数的方法 #include <stdio.h> #include <assert.h> int my_strlen(const char * str)//const的使用优化 {int count0;assert(str)while(*str){count;str;}return count; } 2.用指针的方法&#xff08;指针-指针&#xff09; #include <stdio.h> #incl…

H.机房【蓝桥杯】/数组链式前向星建图+堆优化版dijkstra

机房 数组链式前向星建图堆优化版dijkstra #include<iostream> #include<queue> #include<cstring> #include<vector> using namespace std; typedef pair<int,int> pii; //无向图开两倍 int e[200005],ne[200005],v[200005],h[200005],du[1000…