【序列化】概念及二叉树序列化、反序列化的两种方式

序列化是什么?为什么需要序列化?

        前言:

        (1)进程想要运行,就要向操作系统申请内存空间,进程对数据的所有操作都是在内存空间中完成的。内存中有一部分数据很重要,我们希望将这些数据存储到磁盘中,就算进程被杀死、机器重启仍能找到这些数据,这时候就需要使用到序列化。

        (2)以redis执行命令的流程为例,客户端(进程)想要执行一条命令,首先需要将命令封装(序列化)成redis协议指定的数据格式,随后基于socket将数据发送给redis服务(进程);redis服务收到数据后,将数据解析成具体的命令(反序列化),执行命令后,将执行结果封装成redis协议指定的数据格式(序列化)返回给客户端

        序列化指将数据转化成某种可以存储或传输形式的过程。无论是将内存中的数据迁移到磁盘,还是进程间的通信都需要使用到序列化。

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

题目描述:

解决方案:

        题目需要我们既可以将一棵二叉树转化成字符串的形式(序列化),又可以将字符串还原成一颗二叉树(反序列化)

        (1)先序:

public class Codec {// Encodes a tree to a single string.public String serialize(TreeNode root) {StringBuilder sb = new StringBuilder();String result = serialize(root, sb);return result;}private static String serialize(TreeNode root,StringBuilder sb){//空节点用$符号填充if(root == null)sb.append("$,");else{//非空节点则添加节点值sb.append(root.val + ",");serialize(root.left,sb);serialize(root.right,sb);}return sb.toString();}// Decodes your encoded data to tree.public TreeNode deserialize(String data) {//获取元素是二叉树结点的字符串数组String [] val = data.split(",");//从字符串数组的索引0开始初始化二叉树cnt = 0;TreeNode root = deserialize(val);return root;}//cnt:即将被创建的结点public static int cnt;private static TreeNode deserialize(String [] val){String value = val[cnt++];if (value.equals("$")){//碰到$占位符,说明是空结点,直接返回nullreturn null;}else{//不是$,则创建结点TreeNode node = new TreeNode(Integer.parseInt(value));//将递归结果作为左、右子树node.left = deserialize(val);node.right = deserialize(val);//返回当前结点return node;}}
}

        原理:

        (1)序列化:以先序遍历的方式访问二叉树的每一个结点,并将结点值序列化成字符串,如果碰到空结点,就用$表示,最后会得到一个由"结点值"、"$"、","等三种字符组成的字符串。

        (2)反序列化:将字符串通过split分割成一个字符串数组val,基于val数组和cnt指针以先序的顺序重建字符串。

        (2)层序:配合队列逐层序列化、反序列化二叉树。

public class Codec {public static int MAX = 10001;//用数组模拟队列,层序遍历整棵树public static TreeNode [] q = new TreeNode[MAX];//head == tail时,队列的size == 0public static int head,tail;// Encodes a tree to a single string.public String serialize(TreeNode root) {StringBuilder sb = new StringBuilder();if(root != null){//初始化队列大小head = tail = 0;//序列化当前结点sb.append(root.val + ",");//头结点入队q[tail++] = root;//循环结束条件:队列为空while(head < tail){TreeNode node = q[head++];if(node.left != null){//子节点不为null//既序列化结点,又让结点入队sb.append(node.left.val +",");q[tail++] = node.left;}else{//子节点为null//用$填充,不让结点入队sb.append("$,");}if(node.right != null){sb.append(node.right.val +",");q[tail++] = node.right;}else{sb.append("$,");   }}}return sb.toString();}// Decodes your encoded data to tree.public TreeNode deserialize(String data) {//有可能是空树,空树直接返回nullif(data.equals(""))return null;//分割字符String [] val = data.split(",");//cnt变量从索引0开始遍历val字符串数组,并在遍历过程中创建结点int cnt = 0;//创建根节点TreeNode root = createNode(val[cnt++]);//重置head、tail指针head = tail = 0;q[tail++] = root;while(head < tail){TreeNode node = q[head++];node.left = createNode(val[cnt++]);node.right = createNode(val[cnt++]);//左、右孩子不是空结点就入队//因为要初始化它们的左、右孩子if(node.left != null){q[tail++] = node.left;}if(node.right != null){q[tail++] = node.right;}}return root;}private TreeNode createNode(String val){//val == "$",说明是空结点,返回null//val != "$",不是空结点,创建结点并返回return val.equals("$") ? null : new TreeNode(Integer.parseInt(val));}
}

        层序序列化图解:

        层序反序列化图解:

        以上就是本文的全部内容,有什么错误的地方请评论区指正,如果你觉得本文让你有所收获,不妨点个赞!

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

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

相关文章

Slurm集群管理系统

Slurm集群管理系统 Slurm&#xff08;Simple Linux Utility for Resource Management&#xff0c;https://slurm.schedmd.com/&#xff09;是一个开源的、容错的、高度可扩展的集群管理和作业调度系统&#xff0c;适用于大型和小型高性能计算&#xff08;HPC&#xff09;集群。…

【go语言开发】go项目打包成Docker镜像,包括Dockerfile命令介绍、goctl工具生成

本文主要介绍如何将go项目打包成镜像&#xff0c;首先介绍Dockerfile常用命令介绍&#xff0c;然后介绍使用工具goctl用于生成Dockerfile&#xff0c;还可以根据需求自定义指令内容&#xff0c;最后讲解如何将go-blog项目打包成镜像&#xff0c;以及如何运行等 文章目录 前言Do…

提高工厂能源效率的关键:工厂能耗监测平台

工业做为能源消耗的重要场所&#xff0c;所以节能减排对工业来讲是一个亟需解决的问题。除了对设备进行更新换代外&#xff0c;还需要能源管理消耗监测平台&#xff0c;帮助企业实现节能减排的目标。 工厂能源消费量非常庞大&#xff0c;能源比较难以监测与控制。传统能源的管…

【Linux】信号的保存和捕捉

文章目录 一、信号的保存——信号的三个表——block表&#xff0c;pending表&#xff0c;handler表sigset_t信号集操作函数——用户层sigprocmask和sigpending——内核层 二、信号的捕捉重谈进程地址空间&#xff08;第三次&#xff09;用户态和内核态sigaction可重入函数volat…

04 硬件知识入门(二极管)

1 二极管的定义 导电性能介于导体与绝缘体之间的材料称为半导体&#xff0c;常见的半导体材料有硅、锗和硒等。利用半导体材料可以制作各种各样的半导体元器件&#xff0c;如二极管、三极管、场效应管和晶闸管等都是由半导体材料制作而成的。 2 二极管的简介 1&#xff0e;半…

已解决error: (-215:Assertion failed) inv_scale_x > 0 in function ‘cv::resize‘

需求背景 欲使用opencv的resize函数将图像沿着纵轴放大一倍&#xff0c;即原来的图像大小为(384, 512), 现在需要将图像放大为(768, 512)。 源码 import cv2 import numpy as np# 生成初始图像 img np.zeros((384, 512), dtypenp.uint8) img[172:212, 32:-32] 255 H, W …

华为OD机试 - 九宫格按键输入 - 逻辑分析(Java 2023 B卷 200分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#…

26、卷积 - 实际上是一个特征提取器

矩阵乘法的本质是特征的融合&#xff0c;卷积算法的本质是特征的提取。 回想一下之前所有介绍卷积的时候&#xff0c;描述了一种卷积运算的场景&#xff0c;那就是一个窗口在图片上滑动&#xff0c;窗口中的数值是卷积核的参数&#xff0c;也就是权值。 卷积的计算本质是乘累…

吹响AI技术应用的号角

毫无疑问&#xff0c;各企业正围绕各种技术展开一场持续不断的角逐&#xff0c;力争率先取得领先且具创新性的技术进步&#xff0c;AI技术也不例外。疫情期间&#xff0c;全球各地企业的员工纷纷转向居家办公。因此&#xff0c;为轻松实现这一转型并建立起远程办公的新常态&…

微信小程序中生命周期钩子函数

微信小程序 App 的生命周期钩子函数有以下 7 个&#xff1a; onLaunch(options)&#xff1a;当小程序初始化完成时&#xff0c;会触发 onLaunch&#xff08;全局只触发一次&#xff09;。onShow(options)&#xff1a;当小程序启动或从后台进入前台显示时&#xff0c;会触发 on…

【微信小程序开发】学习小程序的模块化开发(自定义组件和分包加载)

前言 模块化开发是一种将复杂的应用程序分解为一系列独立的模块&#xff0c;每个模块负责完成特定的功能的开发方式。模块化开发可以提高代码的可维护性和可复用性&#xff0c;使开发过程更加高效和灵活。 文章目录 前言模块化开发的重要性和优势自定义组件自定义组件的概念和作…

强强联合!航天科技AIRIOT助力航天电工打造智慧工厂

随着工业4.0时代的到来&#xff0c;电线电缆制造行业正在进入全新的数字化时代&#xff0c;企业需要构建新型智能工厂以助力传统产业智能制造升级。通过搭建智慧系统并结合解决方案&#xff0c;实现从底层产线、车间到工厂资产的全面感知与洞察&#xff0c;以及数据的全量采集与…

接上文 IBM ServeRAID M1015阵列卡 支持RAID5

模块到了&#xff0c;由于着急测试没直接拍照&#xff0c;就是一个跟指甲盖大小的模块&#xff0c;直接安装到阵列卡U1接口上&#xff0c;&#xff0c;不知道U1是哪个位置的参考前文&#xff0c;安装到机器上之后的图片如下 启动服务器&#xff0c;进入WebBIOS&#xff0c;选择…

c语言编译优化引发问题

问题描述 同样的代码,不优化编译,可以正常执行,经过-O2优化编译后,代码被卡住.整体功能涉及多进程,多线程操作. 问题发现 经过加打印,发现卡在while(a!0);//死循环,等待特殊事件发生来解开循环 a初始化为-1; 过一会后,另外有个线程,当特定事件发生的时候,将a置为0; 通过加打…

阻抗控制下机器人接触刚性环境振荡不稳定进行阻抗调节

在阻抗控制下&#xff0c;当机器人接触刚性环境时&#xff0c;可能会出现振荡不稳定的情况。这可以通过调整机器人的阻抗参数来进行调节。 阻抗接触 阻抗参数中的质量、阻尼和刚度都会对机器人控制系统的性能和稳定性产生重要影响。质量主要影响系统的惯性&#xff0c;从而影响…

调试文心大模型或chatgpt的function Calling函数应用场景

沉默了一段时间&#xff0c;最近都在研究AI大模型的产品落地应用&#xff0c;我觉得这个function calling出来后&#xff0c;对目前辅助办公有革命性的改变&#xff0c;可以它来做什么呢&#xff1f;我们先来调试看看&#xff0c;chatgpt和文心大模型的ERNIE Bot支持这个&#…

Python自动化测试PO模型封装过程详解

在自动化中&#xff0c; Selenium 自动化测试中有一个名字经常被提及 PageObject( 思想与面向对象的特征相 同 ) &#xff0c;通常 PO 模型可以大大提高测试用例的维护效率 优点:可重用&#xff0c;业务和对象分离&#xff0c;代码结构清晰&#xff0c;方便代码维护 核心要素 …

数字化智慧工地管理云平台源码(人工智能、物联网)

​智慧工地优势&#xff1a;"智慧工地”将施工企业现场视频管理、建筑起重机械安全监控、现场从业人员管理、物料管理、进度管理、扬尘噪声监测等现场设备有机、高效、科学、规范的结合起来真正实现工程项目业务流与现场各类监控源数据流的有效结合与深度配合&#xff0c;…

【一周安全资讯1202】信安标委发布《网络安全标准实践指南—网络安全产品互联互通 告警信息格式》;网络安全纳入注册会计师考试科目

要闻速览 1、信安标委发布《网络安全标准实践指南—网络安全产品互联互通 告警信息格式》 2、南昌某高校学生个人信息在境外公开出售&#xff0c;警方抓获学校"内鬼" 3、网络安全纳入注册会计师考试科目 4、乌克兰情报机构网攻俄罗斯民航局&#xff0c;称俄民航业正…

合并一个文件夹下的多个txt文件,并对文本内容分列处理。

python 合并一个文件夹下的多个txt文件&#xff0c;并对文本内容分列。 原始文件&#xff1a; 最终结果&#xff1a; import pandas as pd import xlwt import pandas as pd from sqlalchemy import create_engine import pandas as pd import os import glob dirPath g…