LeetCode HOT 100 —— 297.二叉树的序列化与反序列化

news/2024/11/18 6:10:24/

题目

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

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

提示: 输入输出格式与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode
序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。

在这里插入图片描述
在这里插入图片描述

思路

方法一:DFS | 深度优先搜索

(1)序列化:

  1. 采用递归的思想,遍历选择前序遍历,是因为 根∣左∣右 的打印顺序,在反序列化时更容易定位出根节点的值。
  2. 遇到 null 节点也要翻译成特定符号,反序列化时才知道这里是 null,这里用"X"表示null

(2)反序列化:

  1. 定义函数 buildTree 用于还原二叉树,传入由序列化字符串转成的 list 数组
  2. 逐个 poplist 的首项,构建当前子树的根节点,顺着 list,构建顺序是根节点→左子树→右子树
  3. 如果弹出的字符为 “X”,则返回 null 节点。
  4. 如果弹出的字符是数值,则创建root节点,并递归构建root的左右子树,最后返回root。

java代码如下:

class Codec{//序列化public String serialize(TreeNode root){if(root == null){return "X,";}String left = serialize(root.left);String right = serialize(root.right);return root.val + "," + left + right;}//反序列化public TreeNode deserialize(String data){String[] nodes = data.split(",");Queue<String> queue = new ArrayDeque<>(Arrays.asList(nodes));//队列用来存放列表形式的节点return buildTree(queue);}public TreeNode buildTree(Queue<String> queue){String value = queue.poll();if(value.equals("X")){return null;}TreeNode node = new TreeNode(Integer.parseInt(value));//将字符串转化成数字node.left = buildTree(queue);node.right = buildTree(queue);return node;}
}

方法二:BFS | 广度优先搜索

(1)序列化:

维护一个队列,初始让根节点入列,考察出列节点:

  1. 如果出列的节点是 null,将符号 "X" 推入 res 数组。
  2. 如果出列的节点是数值,将节点值推入数组 res,并将它的左右子节点入列。
  3. 子节点 null 也要入列,它对应 "X",要被记录,只是它没有子节点可入列。
  4. 入列、出列…直到队列为空,就遍历完所有节点,res构建完毕,转成字符串就好。

(2)反序列化:

依然先转成list数组,用一个指针 cur 从第二项开始扫描。

  1. 起初,用list[0]构建根节点,并让根节点入列。
  2. 节点出列,此时 cur 指向它的左子节点值,cur+1 指向它的右子节点值。
  3. 如果子节点值是数值,则创建节点,并认 出列 的父亲,同时自己也是父亲,入列。
  4. 如果子节点值为 "X",什么都不用做,因为出列的父亲的 leftright 本来就是 null
    可见,所有的真实节点都会在队列里走一遍,出列就带出儿子入列

java代码如下:

public class Codec {// 序列化public String serialize(TreeNode root) {if (root == null) {return "";}StringBuilder sb = new StringBuilder();Queue<TreeNode> queue = new LinkedList<>();queue.offer(root);while (!queue.isEmpty()) {TreeNode node = queue.poll();if (node == null) {sb.append("X,");} else {sb.append(node.val + ",");queue.offer(node.left);queue.offer(node.right);}}return sb.toString();}// 反序列化public TreeNode deserialize(String data) {if (data == "") {return null;}Queue<String> nodes = new ArrayDeque<>(Arrays.asList(data.split(",")));TreeNode root = new TreeNode(Integer.parseInt(nodes.poll()));Queue<TreeNode> queue = new ArrayDeque<>();queue.offer(root);while (!queue.isEmpty()) {TreeNode node = queue.poll();String left = nodes.poll();String right = nodes.poll();if (!left.equals("X")) {node.left = new TreeNode(Integer.parseInt(left));queue.add(node.left);}if (!right.equals("X")) {node.right = new TreeNode(Integer.parseInt(right));queue.add(node.right);}}return root;}
}

http://www.ppmy.cn/news/4158.html

相关文章

OM6621系列国产M4F内核低功耗BLE5.1大内存SoC蓝牙芯片

目录OM6621系列简介OM6621P系列芯片特性应用领域OM6621系列简介 随着5G与物联网时代的到来&#xff0c;智慧城市、电动出行、智能家居、可穿戴设备等应用高速发展&#xff0c;低功耗蓝牙技术在近几年智能化浪潮中的地位也尤为重要。OM6621系列的开发即是为解决国内低功耗蓝牙应…

企业员工电脑软件应该如何选择?

现在很多企业都希望购买上网行为管理软件&#xff0c;因为这种软件可以控制员工的行为&#xff0c;可以避免员工在工作的时候做与工作无关的事情。但是这种软件应该如何采购&#xff0c;很多企业都搞不懂&#xff0c;现在就来看看在购买上网行为管理软件时应该如何选择。 1. 监…

存储mybatis的xml标签,动态sql 查询

前言&#xff1a; 通过表动态存储mybatis 的xml标签&#xff0c;通过动态sql 入参查询&#xff0c;方便更新查询逻辑&#xff0c;无需发版即可&#xff1b;&#xff08;当前用的是 mybatis-plus &#xff0c;db用的是oracle【这个无所谓】&#xff09; 注意事项&#xff1a;这…

测试人必备的Linux常用命令大全...【全网最全面整理】

Linux常用命令大全&#xff08;非常全&#xff01;&#xff01;&#xff01;&#xff09; 最近都在和Linux打交道&#xff0c;感觉还不错。我觉得Linux相比windows比较麻烦的就是很多东西都要用命令来控制&#xff0c;当然&#xff0c;这也是很多人喜欢linux的原因&#xff0c…

Java安全--CC4

CC4 环境提一小嘴&#xff1a; CC4利用的是commons-collections4&#xff0c;所以我们需要导入新的依赖&#xff0c;地址&#xff1a;https://mvnrepository.com/artifact/org.apache.commons/commons-collections4/4.0 我们先来关注一下利用链&#xff1a; 后半段是一样的&am…

用Gurobi+python求解设施选址问题(facility location)

参考&#xff1a;Gurobi 官方资源 设施选址&#xff08;Facility Location&#xff09; 1.背景介绍 设施选址问题在许多工业领域如物流&#xff0c;通信等都有应用&#xff0c;在本案例中展示如何解决设施选址问题&#xff0c;决策出仓库的数量和地点&#xff0c;为一些超市…

turbo编码原理

一、原理 Turbo的编码器由两个并行的分量编码器组成。分量编码器的选择一般是卷积码。在Turbo码中&#xff0c;输入序列在进入第二个编码器时须经过一个交织器 &#xff0c;用于将序列打乱。两个编码器的输出共同作为冗余信息添加到信息序列之后&#xff0c;对抗信道引起的错误…

基于场景的数据集------明厨亮灶数据集

为了和各位开发爱好者深入合作交流&#xff0c;特此准备分批次开放数据集拱大家交流学士研究使用&#xff0c;整理的非常细腻&#xff0c;有些是专业队伍标注的&#xff0c;主要是菲律宾那边的团队进行标注的。依据众多算法搭建的算法平台主体算法包括 人脸识别&#xff0c;人…