【LeetCode】升级打怪之路 Day 16:二叉树题型 —— 二叉树的构造

今日题目:

  • 654. 最大二叉树
  • 105. 从前序与中序遍历序列构造二叉树
  • 106. 从中序与后序遍历序列构造二叉树
  • 889. 根据前序和后序遍历构造二叉树

目录

      • LC 654. 最大二叉树 【easy】
    • Problem:根据遍历序列来还原二叉树 【classic】 ⭐⭐⭐⭐⭐
      • LC 105. 从前序与中序遍历序列构造二叉树
      • LC 106. 从中序与后序遍历序列构造二叉树
      • LC 889. 根据前序和后序遍历构造二叉树 【稍有难度】

今天主要练习了二叉树的构建的相关题目,典型的是从前序、中序、后序遍历的结果中的两个来还原一颗二叉树,这类题目的技巧类似,同时也是高频考题,需要重点掌握。

二叉树的构造问题一般都是使用「分解问题」的思路:构造整棵树 = 根节点 + 构造左子树 + 构造右子树

LC 654. 最大二叉树 【easy】

654. 最大二叉树

这个题目难度不大,但这个题经典地体现了使用递归的方法来构建一个二叉树

Problem:根据遍历序列来还原二叉树 【classic】 ⭐⭐⭐⭐⭐

这类题目给出前序、中序、后序遍历的序列中的两个,要求来还原二叉树。

要使用分解问题的思路,着眼于如何构造一个二叉节点,然后递归地构建其左右子树。整体思路大致都是

  1. 先从一个序列中确定出根节点的值,创建一个根节点
  2. 利用根节点的值,将两个序列切割成两部分,然后递归构建左右子树

具体在实现上,让我们从例题中具体学习。

LC 105. 从前序与中序遍历序列构造二叉树

105. 从前序与中序遍历序列构造二叉树

这个题目给出了前序遍历和中序遍历的结果,让我们还原二叉树。

这类题目首先画出一张图,便于我们确定切割的界限:

前序和中序

画了这张图后,我们就可以知道:

  • preorder 的首元素就是 root
  • 利用 root 可以将 inorder 切分出左子树和右子树,从而得知左子树的大小 leftSize
  • 利用 leftSize,就可以将 preorder 也切分成左子树和右子树
  • 将切分后的用于递归构建

代码示例:

代码示例
这里有几个关键点:

  • build 函数是主要逻辑所在,其参数包括了两个遍历序列及其范围,便于通过界定范围来递归构建左右子树
  • 先确定 root value,构建出 root,然后切分遍历序列并递归构建(计算出左子树大小 leftSize 对于界定切分范围很有用
  • 千万别把递归构建时的范围弄错了。有个验证的小技巧:root.left 的 build 中的范围、root、root.right 的 build 的范围,这三者应该能够形成一个连续的区间。这个技巧对于检查以及防止多一个少一个这种失误很有用

LC 106. 从中序与后序遍历序列构造二叉树

106. 从中序与后序遍历序列构造二叉树

学会了上一个题目后,这个题的套路一样,所以难度就不大了。代码上也和上一题差不多:

在这里插入图片描述
可以看到。套路基本一模一样。

LC 889. 根据前序和后序遍历构造二叉树 【稍有难度】

889. 根据前序和后序遍历构造二叉树

这个题目和前面有点变化了,前面两个题目给的序列可以唯一确定出一个二叉树,但这个题给的前序和后序无法唯一确定一个二叉树,原因就在于尽管我们可以确定出 root value,但无法通过 root valule 来进一步切分出序列中的左子树部分和右子树部分。

这个题目解题的诀窍在于:我们可以假定一个可以是 left node 的元素作为左子树,并利用它来切分序列。例如下面这个示例:

示例图片
我们可以确定 3 是 root value,然后我们假定 preorder 中 root 的下一个元素 9 就是 left node,尽管它也可能是属于右子树。这种不确定也导致了给定的两个序列无法唯一确定一个二叉树。但幸运的是,我们只需要找到合法的一种可能就行,所以我们可以做出这种假设。

通过这种假设,我们就可以还原一棵二叉树了。这样,代码思路也就和前面两个题目一样了。代码如下:

105 题
可以看出,代码架构与之前的几乎一模一样。

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

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

相关文章

数据库原理实验课(1)

目录 实验内容 安装头歌中的相关内容 具体过程 完结撒花~ 我也是第一次接触oracle的相关软件和操作,所以是一次傻瓜式教学记录 实验内容 安装头歌中的相关内容 具体过程 这是我在百度网盘中下载解压出来的oracle文件夹内的全部内容(可能有因为安装完…

使用Portainer让测试环境搭建飞起来

Docker的用处不多加赘述,Docker目前有以下应用场景: 测试:Docker很适合用于测试发布,将 Docker 封装后可以直接提供给测试人员进行运行,不再需要测试人员与运维、开发进行配合,进行环境搭建与部署。 测试…

【技术】基于Github Pages搭建个人博客静态网页

写在前面: 如果文章对你有帮助,记得点赞关注加收藏一波,利于以后需要的时候复习,多谢支持! 文章目录 一、技术基础二、新建特殊仓库三、上传网页文件四、Github Pages设置 个人网页作为仅服务个人的网页,一…

Grafana变量默认全选

注:本文基于Grafana v9.2.8编写 1 问题 EKS集群里的node按照不同label被分为几类,我需要对这几类的node做一些统计。我希望当我使用lable选择时,node的值自动设置为该lable的所有node集合,而不需要再手动全选。 2 解决方案 变…

微信小程序(五十四)腾讯位置服务示范(2024/3/8更新)

教程如下: 上一篇 1.先在官网注册一下账号(该绑定的都绑定一下) 腾讯位置服务官网 2.进入控制台 3.创建应用 3. 额度分配 4.下载微信小程序SDK 微信小程序SDK下载渠道 5.解压将俩js文件放在项目合适的地方 6.加入安全域名or设置不验证合…

扩展CArray类,增加Contain函数

CArray不包含查找类的函数,使用不便。考虑扩展CArray类,增加Contain函数,通过回调函数暴露数组元素的比较方法,由外部定义。该方法相对重载数组元素的“”符号更加灵活,可以根据需要配置不同的回调函数进行比较 //类型…

AD20中关于“failed to add class member”的解决方法

目录 问题描述: 解决方法: 1.切换至PCB界面-选择工具栏的设计-类 2.把Component classes中的所有的类全部按照图中删除,保存 3.重新返回原理图界面转换PCB即可成功 问题描述: failed to add class member:未能添加…

解答关于:水牛社软件是做什么的?水牛社软件靠谱么?

很多对我们软件感兴趣但是没有入手的观望者都会有这样的疑问:水牛社软件具体是做什么的?水牛社软件靠谱么? 其实软件的简介已经讲的很清楚了,但是软件不是功能性软件,所以不能给大家免费试用,短期任务版块…

智能驾驶规划控制理论学习08-自动驾驶控制模块(轨迹跟踪)

目录 一、基于几何的轨迹跟踪方法 1、基本思想 2、纯追踪 3、Stanly Method 二、PID控制器 三、LQR(Linear Quadratic Regulator) 1、基本思想 2、LQR解法 3、案例学习 基于LQR的路径跟踪 基于LQR的速度跟踪 4、MPC(Mode…

Python通过SFTP实现网络设备配置备份

一、背景 为了防止网络设备意外损坏,导致配置文件无法恢复,可以通过将网络设备的配置文件备份到本地电脑上。 一般情况下,设备支持通过FTP、TFTP、FTPS、SFTP和SCP备份配置文件。其中使用FTP和TFTP备份配置文件比较简单,但是存在…

JAVA虚拟机实战篇之内存调优[4](内存溢出问题案例)

文章目录 版权声明修复问题内存溢出问题分类 分页查询文章接口的内存溢出问题背景解决思路问题根源解决思路 Mybatis导致的内存溢出问题背景问题根源解决思路 导出大文件内存溢出问题背景问题根源解决思路 ThreadLocal占用大量内存问题背景问题根源解决思路 文章内容审核接口的…

尚硅谷JavaScript高级学习笔记

01 准备 JavaScript中函数是对象。我们后续描述构造函数的内存模型时,会将构造函数称为构造函数对象。 02 数据类型 typeof 运算符来查看值的类型,它返回的是类型的字符串值 会做数据转换 03 相关问题 04数据_变量_内存 05相关问题1 06相关问题2 …

办公电脑换成MacBookPro半年之后……

小白是从2008年开始接触电脑的,当时朋友给我注册的第一个QQ账号是2008年4月。 从此,小白一直认为电脑全部都是Windows系统。直到上大学那年,看到了外教老师的MacBookPro…… 折腾电脑的开始居然是起源于诺基亚手机,给半智能S40的…

Igraph入门指南 3

4、图转换到其他R数据结构 图是对实体关系的表达,在igraph中,图可以转换为三种数据结构。 4-1 图转邻接矩阵:as_adjacency_matrix | as_adj,结果是矩阵 邻接矩阵又分为有向图邻接矩阵和无向图邻接矩阵,但本函数使用…

老司机都懂的!【打赏】完美运营的最新视频打赏系统

完美运营的最新视频打赏系统优于市面上95%的打赏系统,与其他打赏系统相比,功能更加强大,完美运营且无bug。支付会调、短链接生成、代理后台、价格设置和试看功能等均没有问题。 以上为原简介,经测试验证。成功搭建并可以正常进入…

Linux学习之线程

目录 线程概念 1.什么是线程? 2.线程的优缺点 3.线程异常 4.线程用途 线程操作 1.如何给线程传参 2.线程终止 3.获取返回值 4.分离状态 5.退出线程 线程的用户级地址空间: 线程的局部存储 线程的同步与互斥 互斥量mutex 数据不一致的主要过…

Sora的核心技术预测

在ChatGPT火爆全网的一年后,OpenAI公司又一次大显身手:推出了全新的文生视频大模型Sora。直接输入文字提示词,即可直接生成长达60秒的视频。 “现实真的要不存在了。” 马斯克直接大呼:人类彻底完蛋了! 马斯克为什么…

CDN(内容分发网络):加速网站加载与优化用户体验

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

【NR技术】 3GPP支持无人机的关键技术以及场景

1 背景 人们对使用蜂窝连接来支持无人机系统(UAS)的兴趣浓厚,3GPP生态系统为UAS的运行提供了极好的好处。无处不在的覆盖范围、高可靠性和QoS、强大的安全性和无缝移动性是支持UAS指挥和控制功能的关键因素。与此同时,监管机构正在调查安全和性能标准以及…

WinSCP下载安装并结合内网穿透实现固定公网TCP地址访问本地服务器

文章目录 1. 简介2. 软件下载安装:3. SSH链接服务器4. WinSCP使用公网TCP地址链接本地服务器5. WinSCP使用固定公网TCP地址访问服务器 1. 简介 ​ Winscp是一个支持SSH(Secure SHell)的可视化SCP(Secure Copy)文件传输软件,它的主要功能是在本地与远程计…