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

news/2024/5/15 8:27:04/文章来源:https://blog.csdn.net/kezade/article/details/130385179

1.问题

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

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

提示: 输入输出格式与 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

2.解题思路

二叉树有很多种遍历思路,如要解决本题,可以参考以下二叉树的遍历算法,序列化不用多说,反序列化就是逆向思考之前是怎么序列化的。本章主要讲解怎么利用层序遍历的思想解决反序列化问题。

二叉树遍历系列

  • 144.二叉树的前序遍历
  • 94.二叉树的中序遍历
  • 145.二叉树的后续遍历
  • 102.二叉树的层序遍历
  • 107.二叉树的层序遍历II
  • 103.二叉树的锯齿形层序遍历(之字形遍历)
  • 199.二叉树的右视图

2.1 BFS

在102.二叉树的层序遍历一文中,我们利用队列的性质对二叉树进行了层序遍历,本章,在序列化时我们也可以用队列,只是不需要分层标识,比如我们可以把它看成是这样:
在这里插入图片描述
我们定义一个空节点,用以标识某个节点无左或右子节点。用下划线分割各个节点的值。

int INF = -2000;
TreeNode emptyNode = new TreeNode(INF);

则序列化后的结果为:1_2_3_-2000_-2000_4_5_-2000_-2000_-2000_-2000;
反序列化时,利用队列,弹出头结点,包装成二叉树节点,对于序列化的序列,取出两个节点,只要值不是-2000,就可以将父子节点进行关联,再入队,依次循环。

2.2 递归

这里以前序遍历思想为例,其他中序、后序遍历类似。
同样,利用上述2.1节中的自定义空节点标识二叉树的空子节点。序列化伪代码大致如下:

String serialize(TreeNode root){if (root == null) {return INF;}//左节点String left=serialize(root.left);//右节点String right=serialize(root.right);return root.val+"_"+left.val+"_"+right.val;
}

反序列化

TreeNode deserialize(String str){//分离节点值ss=str.split("_");//递归反序列化return buildTree(ss);
}TreeNode buildTree(ss){//弹出第一个valuevalue=ss.poll();//非自定义空节点 递归if(value==INF){return null;}//构造节点TreeNode root=new TreeNode(value);root.left=buildTree(ss);root.right=buildTree(ss);return root;
}

3.代码

import java.util.ArrayDeque;
import java.util.Deque;
/*
public class TreeNode {int val = 0;TreeNode left = null;TreeNode right = null;public TreeNode(int val) {this.val = val;}}
*/
public class Solution {//定义空节点的值int INF = -2000;TreeNode emptyNode = new TreeNode(INF);//BFSString Serialize(TreeNode root) {if (root == null) {return "";}//序列化的临时结果StringBuilder sb = new StringBuilder();Deque<TreeNode> d = new ArrayDeque<>();d.addLast(root);while (!d.isEmpty()) {//弹出一个节点,第一个是rootTreeNode poll = d.pollFirst();//序列化的值以下划线分割sb.append(poll.val + "_");//非自定义的空节点关联父节点if (!poll.equals(emptyNode)) {d.addLast(poll.left != null ? poll.left : emptyNode);d.addLast(poll.right != null ? poll.right : emptyNode);}}System.out.println(sb.toString());return sb.toString();}//BFSTreeNode Deserialize(String data) {if (data.equals("")) {return null;}String[] ss = data.split("_");int n = ss.length;//根节点TreeNode root = new TreeNode(Integer.parseInt(ss[0]));Deque<TreeNode> d = new ArrayDeque<>();d.addLast(root);for (int i = 1; i < n - 1; i += 2) {TreeNode poll = d.pollFirst();int a = Integer.parseInt(ss[i]);int b = Integer.parseInt(ss[i + 1]);//非自定义空节点的值,包装成二叉树的节点,关联上父节点if (a != INF) {poll.left = new TreeNode(a);d.addLast(poll.left);}if (b != INF) {poll.right = new TreeNode(b);d.addLast(poll.right);}}return root;}//递归序列化和反序列化//前序遍历String Serialize2(TreeNode root) {if (null == root) {return String.valueOf(INF);}StringBuilder sb = new StringBuilder();sb.append(root.val).append("_").append(Serialize(root.left)).append("_").append(Serialize(root.right));return sb.toString();}TreeNode Deserialize2(String str) {if (null == str || "".equals(str)) {return null;}//将节点元素值分离String[] s = str.split("_");List<String> list = Arrays.stream(s).collect(Collectors.toList());TreeNode root = buildTree(list);return root;}private TreeNode buildTree(List<String> list) {int rootValue = Integer.parseInt(list.remove(0));if ( rootValue == INF) {return null;}TreeNode root = new TreeNode(rootValue);root.left = buildTree(list);root.right = buildTree(list);return root;}
}

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

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

相关文章

代码审计实战3-android java

jks java keystore 作用&#xff1a;保证应用的唯一性 简介&#xff1a;可以理解为java的密钥库&#xff0c;是一个用来存放密钥和证书的仓库。 &#xff08;而keytool就是密钥和证书的管理工具&#xff0c;它把key&#xff08;密钥&#xff09;和certificate&#xff08;证…

Android性能优化—ViewPagers + Fragment缓存优化

大家看标题&#xff0c;可能会有点儿懵&#xff0c;什么是ViewPagers&#xff0c;因为在很久之前&#xff0c;我们使用的都是ViewPager&#xff0c;但是现在更多的是在用ViewPager2&#xff0c;因此用ViewPagers&#xff08;ViewPager、ViewPager2&#xff09;来代替两者&#…

Camtasia2023简体中文标准版免费更新下载

Camtasia专业的 屏幕录制和视频剪辑软件3000多万专业人士在全球范围内使用Camtasia展示产品&#xff0c;教授课程&#xff0c;培训他人&#xff0c;以更快的速度和更吸引人的方式进行沟通和屏幕分享。使您在Windows和Mac上进行录屏和剪辑创作专业外观的视频变得更为简单。 Camt…

一家传统制造企业的上云之旅,怎样成为了数字化转型典范?

众所周知&#xff0c;中国是一个制造业大国。在想要上云以及正在上云的企业当中&#xff0c;传统制造企业也占据了相当大的比例。 那么这类企业在实施数字化转型的时候&#xff0c;应该如何着手&#xff1f;我们不妨来看看一家传统制造企业的现身说法。 国茂股份的数字化转型诉…

mysql免安装版本(简化版)

1&#xff1a;解压mysql-5.7.26-winx64 2&#xff1a;添加data文件夹 3&#xff1a;添加my.ini文件 内容如下&#xff1a; port "3306" # 设置mysql的安装目录 basedir "D://tools\mysql-5.7.26-winx64\mysql-5.7.26-winx64\" # 设置mysql数据库的数…

软件测试面试一定要看的面试题和笔试题全套教程

1、什么是软件测试&#xff1f;2’ 【要点】 在规定条件下对程序进行操作&#xff0c;以发现错误&#xff0c;对软件质量进行评估&#xff0c;包括对软件形成过程的文档、数据以及程序进行测试。 【详解】 软件测试就是在软件投入运行前对软件需求分析、软件设计规格说明书…

【社区图书馆】PyTorch高级机器学习实战

PyTorch高级机器学习实战 作者&#xff1a;王宇龙&#xff0c;清华大学计算机博士&#xff0c;大型互联网公司算法专家&#xff0c;在国际学术会议及期刊发表过多篇论曾出版书籍《PyTorch深度学习入门与实战》&#xff0c;知乎"机器学习”话题优秀回答者。 亮点&#xf…

ssm+java企业公司产品分销商管理系统

一、 二、经营管理&#xff1a; ①分销商每月提交自己进多少货物&#xff08;从总部进购了多少“鹊巢”的商品给自己负责区的大型商超&#xff09;——对应的种类一共进多少货物&#xff1b;该种类中具体的产品又进了多少货物具体到&#xff08;参考三产品管理模块&#xff09;…

PCIE内核注册详解

代码结构 在Linux内核中&#xff0c;PCIe驱动程序的注册和处理涉及到许多文件&#xff0c;其中一些主要的文件包括&#xff1a; drivers/pci/pci.h&#xff1a;这个文件定义了PCIe驱动程序结构体和相关的函数。驱动程序需要包含这个头文件才能使用PCIe相关的函数和结构体。 d…

李宏毅 深度学习

目录 深度学习与自然语言处理 | 斯坦福CS224n 课程带学与全套笔记解读&#xff08;NLP通关指南完结&#xff09;pytorch快速入门csdn快速入门OS包PIL包Opencv包Dataset类Tensorboard的使用torchvision.transforms 的使用torchvision中数据集的使用DataLoader的使用(torch.util…

Git在工作中的使用流程

Git中的分支 master分支&#xff1a;所有用户可见的正式版本&#xff0c;都从master发布&#xff08;也是用于部署生产环境的分支&#xff0c;确保master分支稳定性&#xff09;。主分支作为稳定的唯一代码库&#xff0c;不做任何开发使用。master 分支一般由develop以及hotfi…

从“恰当”的项目管理工具中,了解自己的缺点

项目管理工具是为了帮助管理者&#xff0c;但管理者需要了解自己在特定情况下的“缺点”&#xff0c;才能从“恰当”的工具中获得“恰当”的帮助。如果你不知道在某个特定项目中自己&#xff08;作为项目经理&#xff09;的缺点&#xff0c;也不知道自己需要利用哪些好用的项目…

记录-因为写不出拖拽移动效果,我恶补了一下Dom中的各种距离

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 背景 最近在项目中要实现一个拖拽头像的移动效果&#xff0c;一直对JS Dom拖拽这一块不太熟悉&#xff0c;甚至在网上找一个示例&#xff0c;都看得云里雾里的&#xff0c;发现遇到最大的拦路虎就是JS…

2022年NOC大赛创客智慧编程赛道Python初赛题,包含答案

目录 一、单选题 二、多选题 三、判断题 下载文档打印做题: NOC Python 初赛考题 一、单选题 <

【大数据之Hadoop】十八、MapReduce之压缩

1 概述 优点&#xff1a;减少磁盘IO、减少磁盘存储空间。 缺点&#xff1a;因为压缩解压缩都需要cpu处理&#xff0c;所以增加CPU开销。 原则&#xff1a;运算密集型的Job&#xff0c;少用压缩&#xff1b;IO密集型的Job&#xff0c;多用压缩。 2 压缩算法对比 压缩方式选择时…

IDEA 新版安装教程

目录 一、安装IDEA 1、双击安装&#xff0c;然后下一步 2、修改默认安装路径&#xff0c;自定义目录。(建议所有开发工具都放在同一个盘符) 3、改为自定义安装路径&#xff0c;下一步。&#xff08;不用使用中文或空格&#xff09; 4、创建桌面图标等 5、点击安装&#x…

面板数据进行熵值法

面板数据熵值法分析流程如下&#xff1a; 一、案例背景 当前有9家公司连续5年&#xff08;2018-2022年&#xff09;的财务指标数据&#xff0c;想要通过这份数据&#xff0c;确定各个财务指标的权重。熵值法根据指标离散程度确定赋权大小&#xff0c;客观公正准确度高。本次收…

DJ4-5 路由和选路

目录 一、路由与转发的相互作用 二、路由的基本概念 1. 默认路由器 2. 路由算法 三、网络的抽象模型 1. 节点图 2. 费用 Cost 四、路由算法分类 1. 静态路由算法 2. 动态路由算法 3. 全局路由算法 4. 分布式路由算法 一、路由与转发的相互作用 二、路由的基本概念 …

【1G-6G】移动通信技术发展

移动通信技术发展 1G 早在1947年&#xff0c;贝尔实验室的科学家就提出了蜂窝通信的概念&#xff0c;在20世纪60年代对此进行了系统的实验。20世纪60年代末、70年代初开始出现了第一个蜂窝&#xff08;Cellular&#xff09;系统。蜂窝的意思是将一个大区域划分为若干个相邻的…

通过使用生成对抗市场模型改进基于强化学习的交易的泛化

Improving Generalization in Reinforcement Learning–Based Trading by Using a Generative Adversarial Market Model | IEEE Journals & Magazine | IEEE Xplore Improving Generalization in Reinforcement Learning–Based Trading by Using a Generative Adversaria…