1.题目基本信息
1.1.题目描述
序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。
请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。
提示: 输入输出格式与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。
1.2.题目地址
https://leetcode.cn/problems/serialize-and-deserialize-binary-tree/description
2.解题方法
2.1.解题思路
使用栈求二叉树的前序遍历字符串+DFS反序列化构建二叉树
2.2.解题步骤
序列化:
- 使用栈获取二叉树的前序遍历的字符串序列(注意:需要加上None节点),加None的原因是在反序列化时提供终止递归终止条件
反序列化:
- 第一步,将各个节点的值解析到数组中(包括None节点)
- 第二步,使用DFS将从数组中取出节点,创建节点,并继续DFS获取左右节点的值,并创建子节点放到当前节点的左右位置
3.解题代码
Python代码
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Codec:
def serialize(self, root):
"""Encodes a tree to a single string.
:type root: TreeNode
:rtype: str
"""
# 使用栈获取二叉树的前序遍历的字符串序列(注意:需要加上None节点),加None的原因是在反序列化时提供终止递归终止条件
text=""
stack=[]
node=root
while node or stack:
while node:
text+=f"{node.val},"
stack.append(node)
node=node.left
text+="None,"
node=stack.pop()
node=node.right
text+="None,"
# print(text)
return text
def deserialize(self, data):
"""Decodes your encoded data to tree.
:type data: str
:rtype: TreeNode
"""
# 第一步,将各个节点的值解析到数组中(包括None节点)
nodeStr=""
nodeStrArr=[]
for c in data:
if c==",":
nodeStrArr.append(nodeStr)
nodeStr=""
else:
nodeStr+=c
# 第二步,使用DFS将从数组中取出节点,创建节点,并继续DFS获取左右节点的值,并创建子节点放到当前节点的左右位置
def dfs(arr):
nodeStr=arr.pop(0)
if nodeStr=="None":
return None
else:
node=TreeNode(int(nodeStr))
node.left=dfs(arr)
node.right=dfs(arr)
return node
return dfs(nodeStrArr)