【LeetCode】二叉树的序列化与反序列化 [H](二叉树)

news2024/9/21 18:45:24

297. 二叉树的序列化与反序列化 - 力扣(LeetCode)

一、题目

序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。

请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。

提示: 输入输出格式与 LeetCode 目前使用的方式一致,详情请参阅 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

二、代码

/**
 * 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) {
        // 这里我们用字符串去存储序列化之后的结果,这样就不需要用分隔符分割了,因为容器天然具有分割结构
        StringBuilder ans = new StringBuilder();
        // 调用先序遍历序列化方法,传入二叉树根节点
        pres(root, ans);
        // 返回序列化结果
        return ans.toString();
    }

    // 先序遍历序列化
    public void pres(TreeNode head, StringBuilder ans) {
        // 如果当前节点为空,则将"None,"加入到字符串中,因为空节点也不能忽略
        if (head == null) {
            // 注意要用逗号分隔
            ans.append("None,");
        } else {
            // 就按照先序遍历的顺序进行遍历,遍历到一个节点,就将该节点转换成字符类型添加到队列中
            ans.append(String.valueOf(head.val))
               .append(",");
            pres(head.left, ans);
            pres(head.right, ans);
        }
    }

    // Decodes your encoded data to tree.
    public TreeNode deserialize(String data) {
        // 如果序列化字符串队列为空,则直接返回null
         if (data == null || data.length() == 0) {
            return null;
        }
        // 将字符串按逗号都分割出来
        String[] dataArray = data.split(",");
        Queue<String> dataList = new LinkedList<String>(Arrays.asList(dataArray));
        // 调用反序列化方法,并且返回反序列化后构建好的二叉树根节点
        return preb(dataList);
    }

    // 先序遍历反序列化
    public TreeNode preb(Queue<String> prelist) {
        // 弹出队列头节点
        String value = prelist.poll();
        // 如果是空节点则返回空,就不再往下创建了,这一条遍历顺序就算是结束了
        if ("None".equals(value)) {
            return null;
        }
        // 按照 头 左 右 的顺序去构建二叉树
        // 将弹出的节点创建为Node节点
        TreeNode head = new TreeNode(Integer.valueOf(value));
        head.left = preb(prelist);
        head.right = preb(prelist);
        // 返回构建好的节点
        return head;
    }
}

// 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));

三、解题思路 

序列化

按照先序遍历的顺序,遍历到谁就将谁序列化,并且不能忽略空节点,需要将空节点用占位符补全(占位符就自定义即可)。并且每序列化一个节点,需要用分隔符(分隔符也是自定义即可)将其进行分割(如果转换成字符串的话就需要用分隔符分割,如果是放到有天然分割结构的容器中,就不需要分隔符了)

反序列化

依次消费字符串,先用逗号切分字符串,变为一个数组,数组中每一项是每一个节点的值。然后依次按照数组元素的顺序去消费元素,按照先序遍历的顺序去构建二叉树。

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

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

相关文章

【SpringCloud】Nacos注册中心、配置中心用法与原理(下)

【SpringCloud】Nacos注册中心、配置中心用法与原理&#xff08;下&#xff09; 上集回顾 二、Nacos 配置中心 1. 统一配置管理 &#xff08;1&#xff09;在 Nacos 中添加配置文件 &#xff08;2&#xff09;从微服务拉取配置 2. 配置热更新 方式一&#xff1a;使用 Re…

华为鸿蒙2.0如何安装谷歌服务框架

第一步: 如果安装过Google套件需要先卸载原有Google套件,设置-应用和服务-应用管理,搜索Google、谷歌等,原有谷歌套件全部卸载掉。(注意,要点击右上角打开“显示系统应用”,未安装过可以直接略过) 第二步:下载鸿蒙文件包(自行找资源下载) 1.打开(1.准备)把里面的…

项目2:使用Yolov5和deepsort实现车辆和行人目标跟踪,实时计算目标运动速度和加速度(有检测超速功能)

项目演示视频 项目演示视频可以跳转到哔哩哔哩观看&#xff1a;https://www.bilibili.com/video/BV1RT411Z7kD/?vd_source805c57038e291405fe38f3adefa0f2d2 项目简介 本项目使用Yolov5DeepSort实现车辆、行人跟踪&#xff0c;并实时统计各类别目标数量&#xff0c;以及测量…

人大金仓数据库的库、模式、表空间之间的关系

库、模式、表空间之间的关系 KES数据库结构图 列出集簇现有的数据库清单 \l 默认数据库的作用介绍 数据库定义以及相关操作 创建数据库并设置参数 设置属主、编码、参照模板template0、连接数为0 create database 数据库名 owner 属主用户名 template template0 encoding …

【二叉搜索树】BST相关题目

BST相关题目二叉搜索树中的众树二叉搜索树节点最小距离两数之和 IV - 输入二叉搜索树总结二叉搜索树中的众树 501.二叉搜索树中的众树 解题思路&#xff1a;中序遍历二叉搜索树&#xff0c;使得结果集是有序的&#xff0c;过程中将众数个数保存下来。利用两个变量&#xff0c…

Java---微服务---SpringCloud(2)

SpringCloud021.Nacos配置管理1.1.统一配置管理1.1.1.在nacos中添加配置文件1.1.2.从微服务拉取配置1.2.配置热更新1.2.1.方式一1.2.2.方式二1.3.配置共享1&#xff09;添加一个环境共享配置2&#xff09;在user-service中读取共享配置3&#xff09;运行两个UserApplication&am…

域环境搭建

内网渗透基础——域环境搭建 第一步,配置IP地址 1.打开网络和共享中心 2.更改适配器设置 3.进入网络连接后,设置网卡属性 4.双击进入,修改IP地址 5.使用IP地址如下,IP地址设置为:192.168.1.1;子网掩码设置为:255.255.255.0;DNS属性设置为:192.168.1.1 6.设置好之后确…

Fisco Bcos区块链一(搭建单群组FISCO BCOS联盟链)

文章目录区块链开荒技术文档&#xff1a;https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/index.html推荐准备&#xff1a;1. 搭建单群组FISCO BCOS联盟链安装依赖创建操作目录, 下载安装脚本搭建单群组4节点联盟链启动FISCO BCOS链检查进程检查日志输出区块链开…

我的第一次真实对国外某购物平台web漏洞挖掘

&#xff08;真实世界&#xff09;我的第一次真实对国外某购物平台web漏洞挖掘 开放重定向 - 低危XSS - 低危 这两组合起来就完全不一样一点的&#xff0c;个人觉得比原本高一些 危害&#xff1a;窃取用户敏感数据、用户cookie、钓鱼操作 等… 前言 这是我第一次&#xff…

【ABAQUS 二次开发笔记】使用keyword 、python和matlab一起处理Odb数据

我的主页&#xff1a; 技术邻&#xff1a;小铭的ABAQUS学习的技术邻主页博客园 : HF_SO4的主页哔哩哔哩&#xff1a;小铭的ABAQUS学习的个人空间csdn&#xff1a;qgm1702 博客园文章链接&#xff1a; 【ABAQUS 二次开发笔记】使用keyword 、python和matlab一起处理Odb数据 -…

VBA 自定义Add-in

1. 通过下面的链接下载工具&#xff1a;OfficeCustomUIEditorFiles VBA Ribbon - Microsoft Download 2.将上面下载的ZIP文件解压缩后&#xff0c;运行其中的 “CustomUIEditor.exe”&#xff0c; 打开事先准备好的.xlsm文件&#xff0c;例如&#xff1a;self.xlsm。 2-1.点…

Ubuntu20.04+MAVROS+PX4+Gazebo保姆级安装教程

Ubuntu20.04MAVROSPX4Gazebo安装PX4步骤安装MAVROS安装QGCPX4仿真安装PX4步骤 从github上clone源码 git clone https://github.com/PX4/PX4-Autopilot.git --recursive进入PX4-Autopilot文件夹&#xff0c;继续下载未下载完的组件 cd PX4-Autopilot/ git submodule update -…

什么是数据库连接池?Druid(德鲁伊)连接池的使用详细解读

文章目录1. 数据库连接池2. 概念3. 实现4. Druid 连接池的使用5. 总结Java编程基础教程系列1. 数据库连接池 2. 概念 前面在 JDBC API 的使用详细解读文章中&#xff0c;获取的数据库连接对象 conn&#xff0c;在使用时创建&#xff0c;使用完毕就会将其销毁。这样重复创建和销…

Python if else对缩进的要求

Python 是以缩进来标记代码块的&#xff0c;代码块一定要有缩进&#xff0c;没有缩进的不是代码块。另外&#xff0c;同一个代码块的缩进量要相同&#xff0c;缩进量不同的不属于同一个代码块。不要忘记缩进if、elif 和 else 后面的代码块一定要缩进&#xff0c;而且缩进量要大…

【奇妙的数据结构世界】 用经典例题对数组进行全面分析 | C++

第八章 数组 目录 第八章 数组 ●前言 ●一、数组是什么&#xff1f; 1.简要介绍 2.具体情况 ●二、数组典型例题——一维&二维&三维 1.一维数组&#xff08;校门外的树&#xff09; 2.二维数组&#xff08;彩票摇奖&#xff09; 3.三维数组&#xff08…

自己动手写一个操作系统——MBR(1)

文章目录前言MBR1) 512 字节镜像2) 0x55 和 0xAAqemu 运行参考前言 上篇《自己动手写一个操作系统——我们能做什么&#xff0c;我们需要做什么》我们介绍到 BIOS 会遍历每个磁盘的第一个扇区查找 MBR&#xff0c;找到后便将 MBR 加载到内存并跳转过去。如果没找到&#xff0c…

红黑树和平衡二叉树的区别

一.红黑树的定义 1.节点是红色或者黑色&#xff1b; 2.根节点和叶子节点是黑色&#xff0c;叶子节点为空节点&#xff1b; 3.每个红色节点的叶子节点都是黑色&#xff1b; 4.从任何节点到叶子节点的所有路径包含相同数目的黑色节点&#xff1b; 5.红黑树实现平衡和保持红黑…

代码随想录算法训练营三期 day 25 - 回溯 (2) (补)

216. 组合总和III 题目描述: 216. 组合总和 III 原文链接: 216. 组合总和 III 视频链接: 216. 组合总和 III 树形结构 回溯三部曲&#xff1a; ① 确定回溯函数参数及返回值 和 77. 组合 一样&#xff0c;依然需要一维数组 path 来存放符合条件的结果&#xff0c;二维数组 r…

leetcode-每日一题-计算应缴税款总额(简单,数学逻辑)

给你一个下标从 0 开始的二维整数数组 brackets &#xff0c;其中 brackets[i] [upperi, percenti] &#xff0c;表示第 i 个税级的上限是 upperi &#xff0c;征收的税率为 percenti 。税级按上限 从低到高排序&#xff08;在满足 0 < i < brackets.length 的前提下&am…

(19)go-micro微服务filebeat收集日志

文章目录一 Filebeat介绍二 FileBeat基本组成三 FileBeat工作原理四 Filebeat如何记录文件状态:五 Filebeat如何保证事件至少被输出一次六 安装Filebeat七 使用Filebeatfilebeat.yml编写八 最后一 Filebeat介绍 filebeat是Beats中的一员。 Beats在是一个轻量级日志采集器&…