文章目录

  • 297. 二叉树的序列化与反序列化
    • 题目
    • 解题思路
    • 代码实现
    • 实现结果
    • 总结

297. 二叉树的序列化与反序列化


题目来源:力扣(LeetCode)https://leetcode-cn.com/problems/serialize-and-deserialize-binary-tree

题目


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

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

示例:

你可以将以下二叉树:

    1/ \2   3/ \4   5序列化为 "[1,2,3,null,null,4,5]"

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

说明: 不要使用类的成员 / 全局 / 静态变量来存储状态,你的序列化和反序列化算法应该是无状态的。

解题思路


思路:深度优先搜索

根据题目,我们可以了解到。其实二叉树序列化,是将二叉树按照某种遍历方式以某种格式保存为字符串。在本篇幅当中,我们使用的方法是使用深度优先搜索来达到这个目的。

在这里,我们使用的深度优先搜索的思路,用递归实现,在此过程中,我们使用先序遍历的方式来进行解决。

我们使用递归的时候,只需要关注单个节点,剩下就交给递归实现。使用先序遍历的是因为:先序遍历的访问顺序是先访问根节点,然后遍历左子树,最后遍历右子树。这样在我们首先反序列化的时候能够直接定位到根节点。

这里有个需要注意的地方,当遇到 null 节点的时候,要进行标识。这样在反序列化的时候才能够分辨出这里是 null 节点。

下面使用先序遍历的方式,借助示例 1,用图解的形式说明序列化的过程:

在上面的图示中,根据先序遍历的访问顺序,从根节点 1 开始,序列化字符为 1。然后遍历左子树,此时左子树的根节点为 2,序列化字符为 1, 2, 。这个时候从 2 开始,访问左节点 (1, 2, null, ),右节点 (1, 2, null, null)。在这里 null,就是前面所说标记 null 的符号。这个回到根节点,访问右子树。同样是按照先序遍历的访问顺序,最终序列化字符串的结果是: 1, 2, null, null, 3, 4, null, null, 5, null, null, 。

至于如何反序列化?根据先序遍历的访问顺序的规则来分割,我们从左到右遍历这个序列化的字符串:

  • 当前元素为 null 时,为空树;
  • 不存在上面的情况时,先解析左子树,再解析右子树

具体的实现代码如下。

代码实现


# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = Noneclass Codec:def serialize(self, root):"""Encodes a tree to a single string.:type root: TreeNode:rtype: str"""if root == None:return 'null,'left_serialize = self.serialize(root.left)right_serialize = self.serialize(root.right)return str(root.val) + ',' + left_serialize + right_serializedef deserialize(self, data):"""Decodes your encoded data to tree.:type data: str:rtype: TreeNode"""def dfs(queue):val = queue.popleft()if val == 'null':return Nonenode =  TreeNode(val)node.left = dfs(queue)node.right = dfs(queue)return nodefrom collections import dequequeue = deque(data.split(','))return dfs(queue)# Your Codec object will be instantiated and called as such:
# codec = Codec()
# codec.deserialize(codec.serialize(root))

实现结果


总结


  • 先了解,二叉树序列化其实是按照某种遍历方式,结果以某种格式保存为字符串。
  • 采用 dfs 的方法(同样可以使用 bfs),按照先序遍历的访问方式,序列化二叉树。这里使用先序遍历的方法,同样是方便反序列化时能够快速定位到根节点。因为先序遍历的访问顺序为:先访问根节点,然后遍历左子树,最后遍历右节点。
  • 进行序列化的时候,当遇到 None 时,需要进行标识,这样在反序列化的时候才能够分辨此处为 None,是空树。
  • 反序列化,按照先序遍历的访问规则,分割前面序列化后的字符串,按照从左到右的顺序遍历:
    • 当元素为 null 时,表示是空树;
    • 否则先解析左子树,再解析右子树。

LeetCode 297. 二叉树的序列化与反序列化 | Python相关推荐

  1. Java实现 LeetCode 297 二叉树的序列化与反序列化

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

  2. golang力扣leetcode 297.二叉树的序列化与反序列化

    297.二叉树的序列化与反序列化 297.二叉树的序列化与反序列化 题解 代码 297.二叉树的序列化与反序列化 297.二叉树的序列化与反序列化 题解 题目:给你一个二叉树,序列化从一个string ...

  3. LeetCode 297. 二叉树的序列化与反序列化(前序遍历层序遍历)

    文章目录 1. 题目 2. 解题 2.1 前序遍历 2.2 层序遍历 1. 题目 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过 ...

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

    题目链接: 力扣https://leetcode.cn/problems/serialize-and-deserialize-binary-tree/ [分析]序列化的时候很简单,任意的一种二叉树遍历 ...

  5. 【LeetCode】【HOT】297. 二叉树的序列化与反序列化(BFS)

    [LeetCode][HOT]297. 二叉树的序列化与反序列化 文章目录 [LeetCode][HOT]297. 二叉树的序列化与反序列化 package hot;import java.util. ...

  6. 【leetcode】二叉树,297二叉树的序列化与反序列化

    297. 二叉树的序列化与反序列化 前言 题目难度:困难 一.题目描述 二.前序遍历解法 三.后序遍历解法 四.中序遍历解法 五.层级遍历解法 前言 如果你看过下面这几篇,那这道题应该对你来说信手拈来 ...

  7. LeetCode Java刷题笔记—297. 二叉树的序列化与反序列化

    297. 二叉树的序列化与反序列化 请实现两个函数,分别用来序列化和反序列化二叉树.这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化 ...

  8. leetcode第297——二叉树的序列化与反序列化(层次遍历)

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

  9. lintcode 7. 二叉树的序列化和反序列化 Python代码

    '''7. 二叉树的序列化和反序列化 描述 设计一个算法,并编写代码来序列化和反序列化二叉树.将树写入一个文件被称为"序列化",读取文件后重建同样的二叉树被称为"反序列化 ...

最新文章

  1. 去年领了163亿薪资的马斯克,刚推出智能召唤功能就被吐槽:遇到人开的车就蒙圈...
  2. python sendline_python Pexpect模块的使用
  3. 解决:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):
  4. 安装VisualSVN Server时候,端口号冲突
  5. Pytorch和caffe对maxpool模式ceil比较
  6. 中科院30m二级分类土地利用数据Arcgis预处理及获取
  7. 计算机质量检测技术,计算机技术在建材质量检测中的应用分析
  8. 移动开发技术(Android)——综合实验
  9. 第三节-戴师兄数据分析学习笔记-excel最全函数
  10. android拍照并剪辑
  11. 车祸相关公开数据集(免费下载)
  12. Git和Github的使用
  13. 程序员如何写一份更好的简历
  14. JavaScript过滑块 模拟鼠标拖动(验证码)滑块
  15. 【安全资讯】数据泄露、数据窃听,如何保障大数据时代的信息安全
  16. matlab画出给定点,已知各点之间的距离,怎么用MATLAB画出点
  17. 同时在线用户人数怎么统计?
  18. 树莓派人脸识别_童话树莓派|(十一)进入AI世界人脸识别(防疫检测)
  19. 篇韵文 便识天下汉字(转载)
  20. Linux 目录文件显示绿色高亮的问题

热门文章

  1. 经济学十大原理之四——人们会对激励做出响应
  2. 百度智能云实现文字转语音
  3. 如何清理释放 Android 手机内存空间
  4. NCBI上测序数据的下载
  5. SQL Server2017安装教程
  6. 红米note9和红米note9s有什么区别
  7. 图论——单源路径问题
  8. eclipse启动出错:An error has occurred.See the log file E:\workspace\.metadata\.log.
  9. PDF格式分析(十二)Cross-Reference Table 交叉引用表
  10. 【紫光同创国产FPGA教程】【第一章】Pango Design Suite 2020.3安装