【LeetCode力扣】297. 二叉树的序列化与反序列化

news2025/2/1 11:55:30

 

目录

1、题目介绍

2、解题思路 

2.1、详细过程图解

2.2、代码描述 

 2.3、完整代码


 

1、题目介绍

原题链接:297. 二叉树的序列化与反序列化 - 力扣(LeetCode)

 示例 1:

输入:root = [1,2,3,null,null,4,5]

输出:[1,2,3,null,null,4,5]

示例 2:

输入:root = [ ]

输出:[ ]

示例 3:

输入:root = [1]

输出:[1]

示例 4:

输入:root = [1,2]

输出:[1,2]

提示:

  • 树中结点数在范围 [0, 104] 内
  • -1000 <= Node.val <= 1000

2、解题思路 

二叉树序列化就是将内存中的二叉树变成硬盘中的字符串形式,并且要求每个二叉树能够对应一个唯一的字符串。

二叉树反序列化就是将这个唯一字符串在内存中还原回对应的二叉树。

2.1、详细过程图解

这里采用先序遍历完成序列化。只要理解了一种遍历的序列化,其他遍历(包括不限于中序遍历、后序遍历、层次遍历)的序列化都是依葫芦画瓢了。

先说规则:

  • 通过先序遍历的顺序进行访问二叉树,假如访问到结点1,就将1写入字符串中,同理结点2就是写入2到节点中
  • 如果遇到空结点则在字符串中存入一个标识符号,这里我采用井号 # 来表述空结点。
  • 同时两个节点之间需要使用下划线 _ 隔开,也可以理解为表示一个结点值的结束。

序列化过程图解:

开始时字符串str为空。按照先序遍历,首先是访问结点1,所以此时字符串中存入了1和表示结点值结束的下划线 _。

str[ ]= "1_"

接着先序遍历访问到结点2,继续将2和下划线_拼接进字符串str中。

str[ ]= "1_2_"

接着先序遍历访问到空结点,此时将表示空姐点的标识符号井号#下划线_拼接进字符串str中。

str[ ]= "1_2_#_"

同理依次进行遍历

str[ ]= "1_2_#_#_"

通过依次遍历最后得到str字符串

str[ ]= "1_2_#_#_3_4_#_#_5_#_#_"

这个str字符串即为二叉树的序列化,而用字符串通过先序遍历还原回二叉树就成为反序列化。

反序列化过程图解:

str从前往后遍历,按照先序遍历【头左右】的顺序还原回二叉树。

 

 

 依次遍历str最终完成还原回原二叉树。

 

2.2、代码描述 

使用递归将二叉树按照先序遍历生成对应的序列化字符串ret。

    // Encodes a tree to a single string.
    public String serialize(TreeNode root) {
        if(root == null)   //等于空时返回井号标识符
        {
            return "#_";
        }
        String res = root.val + "_";  //将结点值与下划线_拼接
        res += serialize(root.left);  //将左子树返回的字符串拼接到当前的ret后
        res += serialize(root.right); //将右子树返回的字符串拼接到当前的ret后
        return ret;
    }

使用split方法对字符串进行拆分,拆分出来的值放入一个数组中,再用队列依次接收数组的 值。

    // Decodes your encoded data to tree.
    public TreeNode deserialize(String data) {
        String[] val = data.split("_");  //将data字符串按照下划线_为分隔符对字符串进行拆分
        Queue<String> queue = new  LinkedList<>(); //队列
        for(int i = 0;i < val.length; i++) 
        {
            queue.add(val[i]);   //将拆分出来的值依次入队
        }
        return reconPreOrder(queue);  //返回队列
    }

将得到的队列依次出队,通过递归判断是否为空标识符井号#,是则返回null,否则将值存入新开辟的头结点root中,再通过递归方式创建左子树以及右子树。最后将头结点root返回,即完成二叉树的反序列化。

    public static TreeNode reconPreOrder(Queue<String> queue)
    {
        String val = queue.poll();   //出队
        if(val.equals("#"))   //等于#则返回null
        {
            return null;
        }
        TreeNode root = new TreeNode(Integer.valueOf(val));   //创建头结点存放val值
        root.left = reconPreOrder(queue);   //从递归中获取左子树信息
        root.right = reconPreOrder(queue);  //从递归中获取右子树信息

        return root;   //最后返回头结点
    }

 2.3、完整代码

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Codec {

    // Encodes a tree to a single string.
    public String serialize(TreeNode root) {
        if(root == null)
        {
            return "#_";
        }
        String res = root.val + "_";
        res += serialize(root.left);
        res += serialize(root.right);
        return res;
    }

    // Decodes your encoded data to tree.
    public TreeNode deserialize(String data) {
        String[] val = data.split("_");
        Queue<String> queue = new  LinkedList<>();
        for(int i = 0;i < val.length; i++)
        {
            queue.add(val[i]);
        }
        return reconPreOrder(queue);
    }

    public static TreeNode reconPreOrder(Queue<String> queue)
    {
        String val = queue.poll();
        if(val.equals("#"))
        {
            return null;
        }
        TreeNode root = new TreeNode(Integer.valueOf(val));
        root.left = reconPreOrder(queue);
        root.right = reconPreOrder(queue);

        return root;
    }
}

// Your Codec object will be instantiated and called as such:
// Codec ser = new Codec();
// Codec deser = new Codec();
// TreeNode ans = deser.deserialize(ser.serialize(root));

彩蛋:

在查看其他题解时发现了一个有趣的解题方法(请勿模仿)哈哈哈哈哈

 


 

关于二叉树遍历的精讲:

【算法与数据结构】二叉树的三种遍历代码实现(上)—— 用递归序知识点讲解_Hacynn的博客-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/zzzzzhxxx/article/details/133609612?spm=1001.2014.3001.5502【算法与数据结构】二叉树的三种遍历代码实现(下)—— 非递归方式实现(大量图解)-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/zzzzzhxxx/article/details/133669283?spm=1001.2014.3001.5502

 

如果觉得作者写的不错,求给博主一个大大的点赞支持一下,你们的支持是我更新的最大动力!

如果觉得作者写的不错,求给博主一个大大的点赞支持一下,你们的支持是我更新的最大动力!

如果觉得作者写的不错,求给博主一个大大的点赞支持一下,你们的支持是我更新的最大动力!

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

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

相关文章

代码随想录算法训练营第二十二天丨 二叉树part09

669. 修剪二叉搜索树 思路 递归法 从图中可以看出需要重构二叉树&#xff0c;想想是不是本题就有点复杂了。 其实不用重构那么复杂。 在上图中我们发现节点0并不符合区间要求&#xff0c;那么将节点0的右孩子 节点2 直接赋给 节点3的左孩子就可以了&#xff08;就是把节点…

mac 移动硬盘推出

最近移动硬盘推出总是出现 磁盘无法推出&#xff0c;因为一个或多个程序正在使用它 的问题 解决办法 首先尽可能关闭所有的应用&#xff0c;然后点击左上角的 点击强制退出&#xff0c;注意其中的预览&#xff0c;这个通常就卡在了这里 然后就可以正常退出了

Python点击exe后报错:Failed to execute script xxxx问题的解决办法

最近工作在弄人脸识别的问题&#xff0c;从gitee来pull了一个但是发现报了一个Failed to execute script XXX的问题 造成这个问题的原因是执行文件exe存放的目录不对&#xff0c;可能在打包前exe文件并不是存在在这个位置。 解决方案将exe文件尝试存在在不同目录下&#xff…

【已解决】No Python at ‘D:\Python\python.exe‘

起因&#xff0c;我把我的python解释器&#xff0c;重新移了个位置&#xff0c;导致我在Pycharm中的爬虫项目启动&#xff0c;结果出现这个问题。 然后&#xff0c;从网上查到了这篇博客: 【已解决】No Python at ‘D:\Python\python.exe‘-CSDN博客 但是&#xff0c;按照上述…

数据结构 - 5(二叉树7000字详解)

一&#xff1a;二叉树的基本概念 1.1树形结构 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 注意&am…

如何删除错误堆栈里的数据

修改某个主数据。然后发现N年前&#xff0c;某位开发在DTP上做了一个错误堆栈。 这里面有很多历史错误信息&#xff0c;有几千条了&#xff0c;一条条删肯定不可能。 如果不删除&#xff0c;DTP增量无法激活&#xff0c;明天处理链肯定出问题。 于是找到一位印度大神的方法&a…

java劳务外包管理系统springboot+vue

当前&#xff0c;系统开发的技术已经发展成熟&#xff0c;而且通过计算机网络可以获取开发工具的使用方法&#xff0c;以及规范化编写的模块化代码&#xff0c;这些知识可以帮助开发者顺利完成本系统的编码工作。 采用JavaMysql的方式设计制作的劳务外包管理系统&#xff0c;在…

【Python、Qt】使用QItemDelegate实现单元格的富文本显示+复选框功能

主打一个 折磨 坑多 陪伴。代码为Python&#xff0c;C的就自己逐条语句慢慢改吧。 Python代码&#xff1a; import sys from types import MethodType from PyQt5.QtCore import Qt,QPoint,QSize,QRect,QEvent from PyQt5.QtGui import QStandardItemModel, QStandardItem,QTe…

LeetCode - 318 最大单词长度乘积(Java JS Py C)

目录 题目来源 题目描述 示例 提示 题目解析 算法源码 题目来源 318. 最大单词长度乘积 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你一个字符串数组 words &#xff0c;找出并返回 length(words[i]) * length(words[j]) 的最大值&#xff0c;并且这两个单词…

关于vue3启动的一些错误总结

一、成功解决 npm ERR! ERESOLVE could not resolve 解决办法&#xff1a; npm i --legacy-peer-deps –legacy-peer-deps 作用&#xff1a; 在NPM v7中&#xff0c;现在默认安装peerDependencies。 在很多情况下&#xff0c;这会导致版本冲突&#xff0c;从而中断安装过程。 …

【Transformer系列】关于Transformer的若干问题FAQ解析

一、参考资料 Transformer的细节到底是怎么样的&#xff1f;Transformer 18问 答案解析(1)—史上最全Transformer面试题&#xff1a;灵魂20问帮你彻底搞定Transformer 关于Transformer的若干问题整理记录 Transformer的细节与技巧 二、FAQ Q&#xff1a;什么是Transformer&…

ubuntu修改IP地址

参考&#xff1a;ubuntu修改配置IP地址和DNS的方法总结&#xff08;4种&#xff09;_ubuntu设置ip地址-CSDN博客 面对ubuntu18以上的版本&#xff0c;主要有两种界面&#xff1a;图形化界面和纯命令行界面。 图形化界面配置比较简单&#xff0c;命令行配置稍许复杂&#xff0c…

python中的logging的使用

初级应用 import logginglogging.basicConfig(levellogging.INFO,format%(asctime)s| %(filename)s[line:%(lineno)s] |%(levelname)s| %(message)s,datefmt%Y-%m-%d %H:%M:%S,filenamesys.path[0]/running_log.log,filemodea) logging.info(This is log)高级应用 # logging的…

HTTP 响应头 X-Frame-Options

简介 X-Frame-Options HTTP 响应头用来给浏览器一个指示。该指示的作用为&#xff1a;是否允许页面在 <frame>, </iframe> 或者 <object> 中展现。 网站可以使用此功能&#xff0c;来确保自己网站的内容没有被嵌套到别人的网站中去&#xff0c;也从而避免了…

chatGPT 帮我优化mysql查询语句 优化一下查询速度

最终效果 备份一下数据库&#xff0c;加上索引就行。25ms查询完成。 对比 加上索引之前及之后的 EXPLAIN SELECT d.sn, d.imei1, d.imei2, d.remark FROM device_info_new d INNER JOIN production_log p ON d.state ‘0’ AND p.sn d.sn AND p.imei1 d.imei1 AND p.imei2 …

在雷电模拟器9上安装magisk并安装LSPosed模块以及其Manager管理器(一)

环境&#xff1a;win10 64&#xff0c;雷电模拟器9.0.60(9)&#xff0c;Android 9。 之前我都是用雷电模拟器版本4.0.78&#xff0c;Android版本7.1.2&#xff0c;为什么本篇要使用9了呢&#xff1f;先解答下这个问题。原因如下&#xff1a;经过我的测试&#xff0c;LSPosed不支…

【递归】汉诺塔问题(Java版)

目录 1.题目解析 2.讲解算法原理 2.1.如何来解决汉诺塔问题&#xff1f; 2.2.为什么这道题可以用递归来做&#xff1f; 2.2.1 什么是递归 2.2.2 为什么会用到递归 3.如何编写递归代码&#xff1f; 4.递归的细节展开图 1.题目解析 汉诺塔问题链接 在经典汉诺塔问题中&a…

激活函数小结:ReLU、ELU、Swish、GELU等

文章目录 SigmoidTanhReLULeaky ReLUPReLUELUSoftPlus MaxoutMishSwishGELUSwiGLUGEGLU资源 激活函数是神经网络中的非线性函数&#xff0c;为了增强网络的表示能力和学习能力&#xff0c;激活函数有以下几点性质&#xff1a; 连续且可导&#xff08;允许少数点上不可导&#x…

halcon深度学习中的样本增强

一、问题描述 halcon的例程中&#xff0c;下面是最经典的语义分割例子。 但是&#xff0c;它并没做样本增强&#xff0c;因为 你看下图的代码&#xff0c;第90行&#xff0c;那两个参数都是[]&#xff0c;空的。 二、解决方案 如下图所示&#xff0c;增加了从95到108行&#…