【数据结构】二叉树篇|超清晰图解和详解:二叉树的序列化和反序列化

在这里插入图片描述

  • 博主简介:努力学习的22级计算机科学与技术本科生一枚🌸
  • 博主主页: @是瑶瑶子啦
  • 每日一言🌼: 你不能要求一片海洋,没有风暴,那不是海洋,是泥塘——毕淑敏

目录

  • 一、核心
  • 二、题目
    • 2.1:前序遍历
    • 2.2:完整代码

一、核心

  • 🍊 序列化:本质就是二叉树的遍历,就那么几个:前序、中序、后序、层序。而序列化只不过就是在遍历到节点时,把它记录下来,空节点也是节点,也要记录(一般就是#)。
  • 🍊反序列化:字符串构建二叉树,本质是子问题,也就是递归。

其实在前面纲领篇就(🔗【数据结构】二叉树篇| 纲领&思路01+刷题)过,序列化的本质就是第一种解题思路——遍历一遍二叉树即可解题;反序列化是第二种解题思路——需要递归,利用子问题来构建二叉树。所谓的序列化和反序列,只不过也是唬人的名头罢了。
在这里插入图片描述

在这里插入图片描述

二、题目

🔗297. 二叉树的序列化与反序列化
在这里插入图片描述

/*** 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) {}// Decodes your encoded data to tree.public TreeNode deserialize(String data) {}
}// 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));

在这里插入图片描述

注意:序列化的具体格式没有要求,下面统一按照这种格式:1,2,#,4,#,#,3,#,#,

2.1:前序遍历

在这里插入图片描述

  • 前序遍历_序列化
	String SEP = ",";//分隔符,用来分隔每个节点String NULL = "#";//表示当前节点为null// Encodes a tree to a single string.public String serialize(TreeNode root) {StringBuilder sb = new StringBuilder();//用来装字符串的容器//遍历函数serialize(root, sb);return sb.toString();}public void serialize(TreeNode root, StringBuilder sb){//进行前序遍历if (root == null){sb.append(NULL).append(SEP);}/*******前序位置 */sb.append(root.val).append(SEP);/****************/serialize(root.left, sb);serialize(root.right, sb);}

PS:一般语境下,单单前序遍历结果是不能还原二叉树结构的,因为缺少空指针的信息,至少要得到前、中、后序遍历中的两种才能还原二叉树。但是这里的 node 列表包含空指针的信息,所以只使用 node 列表就可以还原二叉树。

  • 前序遍历_反序列化
	 // Decodes your encoded data to tree.public TreeNode deserialize(String data) {//用来存储前序序列及其节点,方便逐个拿出构建二叉树LinkedList<String> nodes = new LinkedList<>();for (String node : data.split(SEP)){nodes.addLast(node);}return deserialize(nodes);}public TreeNode deserialize(LinkedList<String> nodes){if(nodes.isEmpty()){return null;}/****** 前序遍历位置 ******/// 列表最左侧就是根节点String first = nodes.removeFirst();if (first.equals(NULL)) return null;TreeNode root = new TreeNode(Integer.parseInt(first));//不为空,构建根节点/*********************** */root.left = deserialize(nodes);root.right = deserialize(nodes);return root;}

至于其他遍历的解法,本质还是一样,序列化的本质就是遍历二叉树,反序列化的本质就是构建子问题,这里就不一一详解。

2.2:完整代码

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode(int x) { val = x; }* }*/
public class Codec {String SEP = ",";//分隔符,用来分隔每个节点String NULL = "#";//表示当前节点为null// Encodes a tree to a single string.public String serialize(TreeNode root) {StringBuilder sb = new StringBuilder();//用来装字符串的容器//遍历函数serialize(root, sb);return sb.toString();}public void serialize(TreeNode root, StringBuilder sb){//进行前序遍历if (root == null){sb.append(NULL).append(SEP);return;}/*******前序位置 */sb.append(String.valueOf(root.val)).append(SEP);/****************/serialize(root.left, sb);serialize(root.right, sb);}// Decodes your encoded data to tree.public TreeNode deserialize(String data) {//用来存储前序序列及其节点,方便逐个拿出构建二叉树LinkedList<String> nodes = new LinkedList<>();for (String node : data.split(SEP)){nodes.addLast(node);}return deserialize(nodes);}public TreeNode deserialize(LinkedList<String> nodes){if(nodes.isEmpty()){return null;}/****** 前序遍历位置 ******/// 列表最左侧就是根节点String first = nodes.removeFirst();if (first.equals(NULL)) return null;TreeNode root = new TreeNode(Integer.parseInt(first));//不为空,构建根节点/*********************** */root.left = deserialize(nodes);root.right = deserialize(nodes);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));

💐若有疑问的地方,欢迎随时在评论区or私信找瑶瑶子交流讨论🌺

在这里插入图片描述

  • Java岛冒险记【从小白到大佬之路】

  • LeetCode每日一题–进击大厂

  • Go语言核心编程

  • 算法

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

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

相关文章

优思学院|六西格玛中的概率分布有哪些?

为什么概率分布重要&#xff1f; 概率分布是统计学中一个重要的概念&#xff0c;它帮助我们理解随机变量的分布情况以及与之相关的概率。在面对具体问题时&#xff0c;了解概率分布可以帮助我们选择适当的检验或分析策略&#xff0c;以解决问题并做出合理的决策。 常见的概率…

Level-based Foraging 多智能体游戏仿真环境

游戏场景测试 参考链接&#xff1a; https://kgithub.com/semitable/lb-foraging

Kubernetes技术--k8s核心技术 Secret

1.概述 Secret 解决了密码、token、密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者 Pod Spec中。Secret可以以 Volume 或者环境变量的方式使用。 作用 加密数据存储在/etc中,使得pod容器以挂载volume方式进行访问。在进行的数据存储中是以base64加密的方式…

Mysql批量插入大量数据的方法

使用存储过程进行插入&#xff0c; 在navicate中示例如下&#xff1a; 输入需要的参数点击完成 在begin end中输入代码&#xff0c;示例代码如下 CREATE DEFINERskip-grants userskip-grants host PROCEDURE batch_insert() BEGINdeclare i int default 0; set i0;while i<1…

【实战】十一、看板页面及任务组页面开发(六) —— React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(二十八)

文章目录 一、项目起航&#xff1a;项目初始化与配置二、React 与 Hook 应用&#xff1a;实现项目列表三、TS 应用&#xff1a;JS神助攻 - 强类型四、JWT、用户认证与异步请求五、CSS 其实很简单 - 用 CSS-in-JS 添加样式六、用户体验优化 - 加载中和错误状态处理七、Hook&…

学会Mybatis框架:让你的开发事半功倍【五.Mybatis关系映射】

目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 导语 一、一对一的关系映射 1.表结构 2.resultMap配置 3.测试关系映射 二、一对多的关系映射 1.表结构 2.resultMap配置 3.测试关系映射 三、多对多的关系映射 1.表结构…

安防监控视频平台EasyCVR视频汇聚平台定制项目增加AI智能算法详细介绍

安防视频集中存储EasyCVR视频汇聚平台&#xff0c;可支持海量视频的轻量化接入与汇聚管理。平台能提供视频存储磁盘阵列、视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务器集群、语音对讲、云台控制、电子地图、平台级联、H.265自动转码等功能。为了便…

Java 中数据结构LinkedList的用法

LinkList 链表&#xff08;Linked list&#xff09;是一种常见的基础数据结构&#xff0c;是一种线性表&#xff0c;但是并不会按线性的顺序存储数据&#xff0c;而是在每一个节点里存到下一个节点的地址。 链表可分为单向链表和双向链表。 一个单向链表包含两个值: 当前节点…

react css 污染解决方法

上代码 .m-nav-bar {background: #171a21;.content {height: 104px;margin: 0px auto;} }import React from "react"; import styles from ./css.module.scssexport default class NavBar extends React.Component<any, any> {constructor (props: any) {supe…

多线程的五种“打开”方式

1 概念 1.1 线程是什么&#xff1f;&#xff1f; 线程&#xff08;Thread&#xff09;是计算机科学中的一个基本概念&#xff0c;它是进程&#xff08;Process&#xff09;中的一个执行单元&#xff0c;负责执行程序的指令序列。线程是操作系统能够进行调度和执行的最小单位。…

ZigBee案例笔记 -- RFID卡片读写(模拟饭卡)

RFID模拟饭卡应用 RFID&#xff08;射频识别技术&#xff09;RFID通讯协议RFID发展历史RFID操作流程说明RFID卡片读写流程RFID寻卡RFID防碰撞RFID选卡RFID卡密验证RFID读卡RFID写卡读写数据流程 RFID饭卡模拟案例驱动代码串口协议饭卡操作案例结果优化建议 RFID&#xff08;射频…

前端需要理解的工程化知识

1 Git 1.1 Git 常见工作流程 Git 有4个区域&#xff1a;工作区&#xff08;workspace)、index&#xff08;暂存区&#xff09;、repository&#xff08;本地仓库&#xff09;和remote&#xff08;远程仓库&#xff09;&#xff0c;而工作区就是指对文件发生更改的地方&#xff…