【LeetCode】升级打怪之路 Day 17:二叉树题型 —— 二叉树的序列化与反序列化

今日题目:

  • 297. 二叉树的序列化与反序列化
  • 652. 寻找重复的子树

目录

      • LC 297. 二叉树的序列化与反序列化 【classic】 ⭐⭐⭐⭐⭐
        • 1)序列化逻辑
        • 2)反序列化逻辑
      • LC 652. 寻找重复的子树 【稍有难度】

今天主要学习了二叉树的序列化和反序列化相关的题型以及做题思路,将一个二叉树进行序列化在很多题目中会用到,通常的做法是将 TreeNode 序列化为一个 String,分隔符和 null 可以使用特殊值,比如 , 作为分隔符,# 作为 null,这样通过二叉树遍历的思路就可以轻松将一个 tree 序列化为一个 String。

除此之外,第二个题目还学会了后序遍历的独特特点:前序位置的代码只能从函数参数中获取父节点传递来的数据,而后序位置的代码不仅可以获取参数数据,还可以获取到子树通过函数返回值传递回来的数据。所以当我们需要在遍历过程的每一步中使用到子树的内容,那这部分代码需要放在遍历的后序位置上

LC 297. 二叉树的序列化与反序列化 【classic】 ⭐⭐⭐⭐⭐

297. 二叉树的序列化与反序列化

这个题目就是让我们实现将一个二叉树转化为 String,再将 String 还原为二叉树。通过这个题目,我们可以学习如何序列化以及反序列化一个二叉树。

这里需要明确一个关键点:之前我们说需要前序+后序两个遍历序列才能还原一个二叉树,但现在我们想只通过前序或后序遍历二叉树得到 String 后,再从这个 String 还原二叉树,这可能嘛?这其实可以的,关键原因在于,我们序列化的 String 中记录了 NULL 节点,而之前的遍历序列中没有 NULL。正是因为序列化结果中记录了 NULL,我们才可以还原这个二叉树。

1)序列化逻辑

直观的,我们可以通过前序遍历来序列化二叉树:

前序遍历的序列化

前序遍历的递归遍历逻辑写成 serializeHelper() 函数,利用 StringJoiner 来完成字符串的拼接:

序列化代码

可以看到,这里的 serializeHelper() 函数的逻辑就是前序递归遍历的逻辑架构。

2)反序列化逻辑

序列化部分将二叉树转换为 String,而反序列化则将 String 还原为二叉树,所以我们需要根据我们序列化时的特点来完成反序列化。

整体思路:先对 String 按照分隔符 SEP 将其切分,从而得到由元素组成的 List<Integer>,空节点就用 null 表示。然后将列表的第一个元素取出来作为 root value,然后再依次反序列化左子树和右子树。

图示如下:

序列化图示
代码如下:

反序列化代码
这里也是递归的逻辑,全局使用同一个 nodeVals 列表,并且每次会移除掉首元素来构建 root,所以反序列化完成左子树后,nodeVals 列表就会正好只剩下右子树的所有节点。

以上就是使用前序遍历的思路完成了二叉树的序列化和反序列化。

除了使用前序遍历的思路外,还可以使用后序遍历和层序遍历的思路来完成,详见 东哥带你刷二叉树(序列化篇) | labuladong 文章。

LC 652. 寻找重复的子树 【稍有难度】

  • 652. 寻找重复的子树
  • 东哥带你刷二叉树(后序篇)| labuladong

这个题目我们需要学会两个点:

  1. 遍历时后序位置上的独特点:前序位置的代码只能从函数参数中获取父节点传递来的数据,而后序位置的代码不仅可以获取参数数据,还可以获取到子树通过函数返回值传递回来的数据。所以,一旦你发现题目和子树的内容有关,那大概率要给函数设置合理的定义和返回值,在后序位置写代码了。
  2. 对二叉树序列化的运用

这个题的基本思路很容易想到:遍历二叉树,遍历的每一步都记录下这个子树的结构,并检查是否有重复,有重复的话就将节点加入到 result 中。

这个题目有两个关键点:

  • 因为在遍历节点时,我们需要知道整个子树的内容,所以需要在后序位置上记录子树。
  • 记录子树结构的方式就是:序列化子树得到 String,并将其记录下来

在这里,我们序列化的方法可以采用与上一个题类似的思路,将序列化的逻辑加入到递归遍历的过程中,并在遍历过程中记录所有子树:

652 代码
因为我们结果集中不允许有重复,所以与 history 相重复的节点只能有一个加入到 result 中,所以 history 中使用 map 的 value 来记录是否已经加入到 result 中。

这个题目,如果能认识到后序遍历的特点和掌握二叉树的序列化,那这个题目就难度还行。

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

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

相关文章

数字逻辑-时序逻辑电路一

一、实验目的 &#xff08;1&#xff09;熟悉触发器的逻辑功能及特性。 &#xff08;2&#xff09;掌握集成D和JK触发器的应用。 &#xff08;3&#xff09;掌握时序逻辑电路的分析和设计方法。 二、实验仪器及材料 三、实验内容及步骤 1、用D触发器&#xff08;74LS74&am…

使用Docker在windows上安装IBM MQ

第一步、安装wsl 详见我另一篇安装wsl文章。 第二步、安装centos 这里推荐两种方式&#xff0c;一种是从微软商城安装&#xff0c;一种是使用提前准备好的镜像安装&#xff0c;详见我另一篇windos下安装centos教程。 第三步、安装windows下的Docker desktop 详见我另一篇wind…

TQ15EG开发板教程:运行MPSOC+AD9361

目录 1&#xff0c;下载工程需要使用的文件 2&#xff0c;编译以及修改工程 3&#xff0c;获取生成BOOT.BIN所需要的3个文件 3.1生成bit文件 3.2生成elf文件 3.3生成fsbl文件 4&#xff0c;生成boot.bin文件 5&#xff0c;上板测试 6&#xff0c;切换FMC接口 7&#…

自适应窗口图片轮播HTML代码

自适应窗口图片轮播HTML代码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c;重定向这个界面 代码下载地址 自适应窗口图片轮播HTML代码

分享 | 计算机组成与设计学习资料+CPU设计源码+实验报告

1.引言 百度网盘资源链接&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1Ww6u_l1L6DMXofC2HxfETw?pwdyqd6 提取码&#xff1a;yqd6 2.学习资源预览 2.1 包含学习手册四本&#xff1a; - 计算机原理与设计&#xff1a;Verilog HDL版 - 计算机组成与设…

开源分子对接程序rDock使用方法(2)-高通量虚拟筛选HTVS

欢迎浏览我的CSND博客&#xff01; Blockbuater_drug …点击进入 文章目录 前言一、rDock用于高通量虚拟筛选HTVSMulti-Step Protocol HTVS步骤及注意事项 二、rDock中Multi-Step Protocol用于HTVS的用法Step 1. Exhaustive dockingStep 2. sdreport summaryStep 3. 运行rbhtfi…

Linux之NFS网络文件系统详解

华子目录 简介NFS背景介绍注意 生产应用场景NFS工作原理示例图流程 NFS的使用安装配置文件主配置文件分析权限参数/etc/exports文件内容示例 实验1nfs账户映射实验2实验3 autofs自动挂载服务产生原因安装配置文件分析挂载参数 实验4实验5&#xff1a;本机自动挂载光驱 简介 NF…

专升本 C语言笔记-08 goto语句

goto语句 无条件跳转运算符(凡是执行到goto语句会直接跳转到 定义的标签) 缺点&#xff1a;滥用goto语句将会导致逻辑混乱&#xff0c;导致系统崩溃等问题! ! ! 代码演示 int i 0; //定义标签 jump(名字随便起哦) jump:printf("%d ",i); i; if(i < 10)goto j…

如何处理Android悬浮弹窗双击返回事件?

目录 1 前言 1.1 准备知识 1.2 问题概述 2 解决方案 3 代码部分 3.1 动态更新窗口焦点 3.2 窗口监听返回事件 3.3 判断焦点是否在窗口内部 3.4 窗口监听焦点移入/移出 1 前言 1.1 准备知识 1&#xff09;开发环境&#xff1a; 2D开发环境&#xff1a;所有界面或弹窗…

Burp Suite Professional Error No response received from remote server.

记录burp suite 抓到包-改包-放包之后出现的问题&#xff1a; Burp Suite Professional Error No response received from remote server. 重新下载软件&#xff0c;没有进行汉化&#xff0c;好用了。汉化真坑。

buuctf warmup 超详细

目录 1.代码审计&#xff1a; 2.逻辑分析 3.总结分析 4.分析记录 5.疑点解答 1.代码审计&#xff1a; <?phphighlight_file(__FILE__);class emmm //定义了一个类{public static function checkFile(&$page) 类里面又申明创建…

论文阅读——RemoteCLIP

RemoteCLIP: A Vision Language Foundation Model for Remote Sensing 摘要——通用基础模型在人工智能领域变得越来越重要。虽然自监督学习&#xff08;SSL&#xff09;和掩蔽图像建模&#xff08;MIM&#xff09;在构建此类遥感基础模型方面取得了有希望的结果&#xff0c;但…

【JavaScript】面试手撕柯里化函数

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 引入柯里化定义实现快速使用柯里化的作用提高自由度bind函数 参考资料 引入 上周…

目标跟踪SORT算法原理浅析

SORT算法 Simple Online and Realtime Tracking(SORT)是一个非常简单、有效、实用的多目标跟踪算法。在SORT中&#xff0c;仅仅通过IOU来进行匹配虽然速度非常快&#xff0c;但是ID switch依然非常严重。 SORT最大特点是基于Faster RCNN的目标检测方法&#xff0c;并利用卡尔…

跟着GPT学设计模式之桥接模式

说明 桥接模式&#xff0c;也叫作桥梁模式&#xff0c;英文是 Bridge Design Pattern。在 GoF 的《设计模式》一书中&#xff0c;桥接模式是这么定义的&#xff1a;“Decouple an abstraction from its implementation so that the two can vary independently。”翻译成中文就…

【Ubuntu-20.04】OpenCV-3.4.16的安装并对图片与视频处理

【Ubuntu-20.04】OpenCV-3.4.16的安装并对图片与视频处理 一、安装OpenCV-3.4.161.下载OpenCV-3.4.16安装包2.将安装包放到/home&#xff0c;并解压3.使用 cmake 安装 opencv4.配置环境5.查看 opencv 的版本信息 二、处理图片&#xff08;一&#xff09;创建文件夹 code &#…

深入理解Python中的面向对象编程(OOP)【第129篇—Scikit-learn的入门】

深入理解Python中的面向对象编程&#xff08;OOP&#xff09; 在Python编程领域中&#xff0c;面向对象编程&#xff08;Object-Oriented Programming&#xff0c;简称OOP&#xff09;是一种强大而灵活的编程范式&#xff0c;它允许开发者以对象为中心组织代码&#xff0c;使得…

错误: 找不到或无法加载主类 Hello.class

在运行这串代码 public class Hello{ public static void main(String[] args){ System.out.println("Hello world!"); } } 的时候出现报错&#xff1a;错误: 找不到或无法加载主类 Hello.class 入门级错误 1.公共类的文件名和类名不一致 hello.j…

2024国际数字体育科技与电子竞技博览会在深圳前海隆重召开

随着科技的飞速发展,数字体育与电子竞技日益成为全球关注的焦点。3月2日,由中国电子商会数字体育与电子竞技专业委员会指导、赛艾特会展(深圳)有限公司、深圳国合华鑫科技发展有限公司、通联(深圳)数字科技集团有限公司联合主办的2024国际数字体育科技与电子竞技博览会新闻发布…

面试题 --- jdbc执行流程、MyBatis执行流程、MyBatis拦截器配置流程

jdbc执行流程 1. 注册驱动 2. 创建数据库操作对象 3. 执行sql语句 4 .处理操作结果 5 .关闭连接释放资源 MyBatis 执行流程 Executor执行器、MappedStatement 对象、 StatementHandler 语句处理器 关系可以用以下步骤概括 用户通过 SqlSession 调用一个方法&#xff0c;Sq…