【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 题
可以看出,代码架构与之前的几乎一模一样。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++vector的使用方法

文章目录 一、vector的介绍1. 文档链接2. 简要介绍 二、vector的使用1.vector的定义(1)构造函数(2)拷贝构造函数(2)赋值重载 2. vector 增删查改(1)operator [](2&#x…

[HackMyVM]靶场 Quick3

kali:192.168.56.104 主机发现 arp-scan -l # arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:d2:e0:49, IPv4: 192.168.56.104 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.56.1 0a:00:27:00:00:05 (U…

HTML—常用标签

常用标签&#xff1a; 标题标签&#xff1a;<h1></h1>......<h6></h6>段落标签&#xff1a;<p></p>换行标签&#xff1a;<br/>列表&#xff1a;无序列表<ul><li></li></ul> 有序列表<ol>&…

她们正在影响AI进程

今天是3月8日&#xff0c;祝广大女性同胞节日快乐&#xff01; 当下&#xff0c;人工智能正是全球科技圈最受关注的领域&#xff0c;甚至没有之一。 在人工智能领域诞生兴起的几十年内&#xff0c;女性科学家作为重要力量&#xff0c;一直在推动行业不断向前发展。 从基础算…

并查集(蓝桥杯 C++ 题目 代码 注解)

目录 介绍&#xff1a; 模板&#xff1a; 题目一&#xff08;合根植物&#xff09;&#xff1a; 代码&#xff1a; 题目二&#xff08;蓝桥幼儿园&#xff09;&#xff1a; 代码&#xff1a; 题目三&#xff08;小猪存钱罐&#xff09;&#xff1a; 代码&#xff1a; …

异常-Exception

文章目录 异常-Exception常见的运行时异常NullPointerException&#xff08;空指针异常&#xff09;ArithmeticException&#xff08;数学运算异常&#xff09;ArrayIndexOutOfBoundsException&#xff08;数组下标越界异常&#xff09;ClassCastException&#xff08;类型转换…

鸿蒙实战开发Camera组件:【相机】

相机组件支持相机业务的开发&#xff0c;开发者可以通过已开放的接口实现相机硬件的访问、操作和新功能开发&#xff0c;最常见的操作如&#xff1a;预览、拍照和录像等。 基本概念 拍照 此功能用于拍摄采集照片。 预览 此功能用于在开启相机后&#xff0c;在缓冲区内重复采集…

ARC-Challenge数据集分享

来源: AINLPer公众号&#xff08;每日干货分享&#xff01;&#xff01;&#xff09; 编辑: ShuYini 校稿: ShuYini 时间: 2024-2-28 该数据集由Allen Institute for Artificial Intelligence&#xff08;AI2&#xff09;发布&#xff0c;旨在推动高级问答的研究。该数据集包含…

3D数字孪生运行不起来?该检查你的电脑配置了

运行3D数字孪生项目通常需要一定的计算资源和图形处理能力。以下是一些常见的电脑配置要求&#xff0c;可以作为参考&#xff1a;1处理器&#xff08;CPU&#xff09;&#xff1a;推荐使用多核心处理器&#xff0c;如Intel Core i7或更高级别的处理器。较高的时钟频率和较大的缓…

kafka报文模拟工具的使用

日常项目中经常会碰到消费kafka某个topic的数据&#xff0c;如果知道报文格式&#xff0c;即可使用工具去模拟发送报文&#xff0c;以此测试代码中是否能正常消费到这个数据。 工具资源已上传&#xff0c;可直接访问连接下载&#xff1a;https://download.csdn.net/download/w…

CSS补充(下),弹性布局(上)

高级选择器 1.兄弟选择器 2.同时满足 div.bg{background-color: red;}p.bg{background-color: green;}spam.bg{background-color: blue;}注&#xff1a;选择器中间没有空格&#xff0c;有明确标识的选择器写在后面 3.各种伪类的应用 3.1作为第几个子元素 选择器:nth-child…

React-父传子

1.概念 说明&#xff1a;父组件传递数据子组件标签身上绑定属性&#xff1b;子组件接受数据props的参数。props是一个对象&#xff0c;包含父组件传递的所有数据。例如数字、字符串、布尔值、数组、对象、函数、JSX。不允许直接修改父组件传递的数据。 2.例子 // 父传子 // …

uniapp踩坑之项目:uni.previewImage简易版预览单图片

主要使用uni.previewImage //html <view class"box-card" v-for"(item,index) in DataList" :key"index"><view>图片&#xff1a;</view><image :src"item.Path" tap.stop"clickImg(item.Path)">&l…

有点NB的免费wordpress主题模板

一个不错的黄色模板&#xff0c;用WP免费主题模板搭建家政服务公司网站。 https://www.wpniu.com/themes/15.html

【性能】JDK和Jmeter的安装与配置

一、JDK环境配置 1. 下载JDK 官网下载地址&#xff1a;http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7-521261.html 选择对应系统的安装包&#xff0c;下载后安装&#xff0c;安装中记录JDK安装的地址&#xff0c;之后一直点击下一…

继深圳后,重庆与鸿蒙展开原生应用开发合作

截至2023年底&#xff0c;开源鸿蒙开源社区已有250多家生态伙伴加入&#xff0c;开源鸿蒙项目捐赠人达35家&#xff0c;通过开源鸿蒙兼容性测评的伙伴达173个&#xff0c;累计落地230余款商用设备&#xff0c;涵盖金融、教育、智能家居、交通、数字政府、工业、医疗等各领域。 …

【Python】科研代码学习:三 PreTrainedModel, PretrainedConfig, PreTrainedTokenizer

【Python】科研代码学习&#xff1a;三 PreTrainedModel, PretrainedConfig, PreTrainedTokenizer 前言Models : PreTrainedModelPreTrainedModel 中重要的方法 tensorflow & pytorch 简单对比Configuration : PretrainedConfigPretrainedConfig 中重要的方法 Tokenizer : …

Java基础面试题(day 01)

&#x1f4d1;前言 本文主要是【Java】——Java基础面试题的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304;每日一句&am…

C++ 篇 数组

数组是含有多个数据项的数据结构&#xff0c;并且这些数据项都具有相同的数据类型。这些数据项称为数组的元素&#xff0c;我们可以根据元素在数组中的位置来选取元素。 最简单的数组就是一维数组。数组元素在内存中是依次排列的&#xff0c;如下图所示&#xff1a; 声明一个…

C++之创建与使用dll

目录 1、创建dll test.h test.cpp Source.def 2、使用dll testdll.cpp DLL&#xff0c;全称“Dynamic Link Library”&#xff0c;中文名为“动态链接库”&#xff0c;是一种在Windows操作系统中常见的库文件格式。它包含了可以由多个程序同时使用的代码和数据。与静态链接…