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

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

        前言:

        (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("$")){
            //碰到$占位符,说明是空结点,直接返回null
            return 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 == 0
    public 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) {
        //有可能是空树,空树直接返回null
        if(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));
    }
}

        层序序列化图解:

        层序反序列化图解:

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

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

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

相关文章

Java基础-java.util.Scanner接收用户输入

目录 1. 导入所需要的jar包2. 编写代码运行3. 输出运行结果 1. 导入所需要的jar包 import java.util.Scanner;2. 编写代码运行 public class ScannerDemo {public static void main(String[] args) {/** 使用Scanner接收用户键盘输入的数据* 1. 导包&#xff1a;告诉程序去JD…

springboot077基于SpringBoot的汽车票网上预订系统

springboot077基于SpringBoot的汽车票网上预订系统 源码获取&#xff1a; https://docs.qq.com/doc/DUXdsVlhIdVlsemdX

零基础学Python第七天||字符串(4)

字符串的内容的确不少&#xff0c;甚至都有点啰嗦了。但是&#xff0c;本节依然还要继续&#xff0c;就是因为在编程实践中&#xff0c;经常会遇到有关字符串的问题&#xff0c;而且也是很多初学者容易迷茫的。 字符串格式化输出 什么是格式化&#xff1f;在维基百科中有专门…

jsp使用 分页专用工具

分页器&#xff0c;根据过来的参数计算当着页应当从哪一条记录开始显示&#xff0c;并且显示到哪。 PageUtils [pageSize5, currIndex1, totalCount166, totalPage34, startPosition0] PageUtils [pageSize5, currIndex5, totalCount166, totalPage34, startPosition20] PageUt…

深度学习基础介绍

定义&#xff1a; 深度学习是机器学习领域中一个新的研究方向&#xff0c;被引入机器学习使其更接近于最初的目标&#xff0c;即人工智能AI&#xff0c; Artifical Intelligence。 深度学习是学习样本数据的内在规律和表示层次&#xff0c;这些学习过程中获得的信息对诸如文字…

Leetcode 39 组合总和

题意理解&#xff1a; 一个 无重复元素 的整数数组 candidates 和一个目标整数 target 从candidates 取数字&#xff0c;使其和 target &#xff0c;有多少种组合&#xff08;candidates 中的 同一个 数字可以 无限制重复被选取&#xff09; 这道题和之前一道组合的区别&am…

Databend 如何利用 GPT-4 进行质量保证

背景 在数据库行业&#xff0c;质量是核心要素。 Databend 的应用场景广泛&#xff0c;特别是在金融相关领域&#xff0c;其查询结果的准确性对用户至关重要。因此&#xff0c;在快速迭代的过程中&#xff0c;如何确保产品质量&#xff0c;成为我们面临的重大挑战。 随着 Da…

IDEA项目发布中,Web Application:Exploded和Web Application:Archive的详细解释

简单总结下&#xff1a; 1、web application:exploded&#xff1a;这个是以文件夹形式发布项目&#xff0c;发布项目时就会自动生成文件夹在指定的output directory&#xff1b;&#xff08;开发&#xff09; 2、web application:archive&#xff1a;就是war包形式&#xff0…

芯片量产导入知识

什么是芯片量产 从芯片功能设计到生产制造、测试等环节&#xff0c;每一个环节都至关重要。 对于保障大规模发货后芯片指标表现的一致性&#xff0c;以及产品应用生命周期内的稳定性和可靠性&#xff0c;需要考虑多种因素。以下是一些相关的观点&#xff1a; 可量产性设计&am…

Java网络通信总结

网络程序设计基础 局域网与互联网 为了实现两台计算机的通信&#xff0c;必须用一个网络线路连接两台计算机。如下图所示 网络协议 1.IP协议 IP是Internet Protocol的简称&#xff0c;是一种网络协议。Internet 网络采用的协议是TCP/IP协议&#xff0c;其全称是Transmission …

基于 Linux 内核驱动模块的简介

基于 Linux 内核驱动模块的简介 最简内核驱动原理 内核编程的最简单表现就是内核模块&#xff0c; 它可以作为一段可动态加载的成熟的内核级的代码使用。使用时一般不限制模块个数和类型&#xff0c;即插即用&#xff0c; 高效快捷、 性能稳定。缺点为性能和内存利用缺失&#…

Carla自动驾驶仿真六:pygame多个车辆摄像头画面拼接

此文章主要介绍carla前后左右摄像头画面拼接到pygame上 文章目录 前言一、要点分析二、完整代码三、拼接效果四、总结 前言 1、使用carla做仿真测试或者开发时&#xff0c;如果能够将车辆周边的画面拼接并渲染&#xff0c;可以直观地查看周围地环境&#xff0c;便于调试。本文…

如何成为前1%的程序员

如果你想成为前1%的程序员&#xff0c;你必须遵循1%的程序员做什么&#xff0c;了解其他99%的人不做什么。在现代&#xff0c;我们有各种学习平台&#xff0c;里面充满了与编程相关的视频、图文以及其他资料。 举例来说&#xff0c;我作为编程的初学者&#xff0c;去寻找路线图…

【Vue第3章】使用Vue脚手架_Vue2

目录 3.1 初始化脚手架 3.1.1 说明 3.1.2 具体步骤 3.1.3 模板项目的结构 3.1.4 笔记与代码 3.1.4.1 笔记 3.1.4.2 01_src_分析脚手架 3.2 ref与props 3.2.1 ref 3.2.2 props 3.2.3 笔记与代码 3.2.3.1 笔记 3.2.3.2 02_src_ref属性 3.2.3.3 03_src_props配置 3…

CTF网络安全大赛是干什么的?发展史、赛制、赛程介绍,参赛需要学什么?

CTF&#xff08;Capture The Flag&#xff09;是一种网络安全竞赛&#xff0c;它模拟了各种信息安全场景&#xff0c;旨在提升参与者的网络安全技能。CTF 赛事通常包含多种类型的挑战&#xff0c;如密码学、逆向工程、网络攻防、Web 安全、二进制利用等。 发展史 CTF 的概念…

《巫师3》缺失vcomp110.dll如何解决,如何快速修复vcomp110.dll丢失问题

在日常使用电脑的过程中&#xff0c;我们可能会遇到一些错误提示&#xff0c;其中之一就是“vcomp110.dll丢失”。这个错误提示通常意味着vcomp110.dll文件在系统中无法找到或加载。那么&#xff0c;vcomp110.dll丢失的原因是什么&#xff1f;它对电脑有什么影响&#xff1f;本…

ky10 server x86 设置网卡开机自启

输入命令查看网卡名称 ip a 输入命令编辑网卡信息 vi /etc/sysconfig/network-scripts/*33改成yes 按ESC键&#xff0c;输入:wq&#xff0c;保存

人工智能大型语言模型的突破

近年来&#xff0c;随着深度学习和人工智能技术的飞速发展&#xff0c;大型语言模型在自然语言处理领域取得了巨大的突破&#xff0c;引发了广泛的关注和讨论。本文将介绍大型语言模型的发展历程、技术原理、应用场景以及未来发展趋势。 一、发展历程大型语言模型的发展可以追…

Android app性能优化指南

Android应用性能优化指南 提高应用程序的性能以实现更流畅的用户体验和更高的可见度。 性能在任何应用程序的成功中发挥着重要的作用。为用户提供流畅无缝的体验应该是开发人员的重点。 应用程序大小 在用户开始使用我们的应用程序之前&#xff0c;他们需要下载应用程序并将…

oracle实验2023-12-8--触发器

第十四周实验 【例】功能要求&#xff1a;增加一新表XS_1&#xff0c;表结构和表XS相同&#xff0c;用来存放从XS表中删除的记录。 分析: 1、创建表 xs_1 SQL> create table xs_1 as select * from xs; Table created SQL> truncate table xs_1; Table truncated题目&a…