二叉树的序列化与反序列化
序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。
请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。
提示: 输入输出格式与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。
示例 1:
输入:root = [1,2,3,null,null,4,5]输出:[1,2,3,null,null,4,5]
示例 2:
输入:root = []输出:[]
示例 3:
输入:root = [1]输出:[1]
示例 4:
输入:root = [1,2]输出:[1,2]
思路:
对二叉树序列化,需要我们按一种特定顺序把二叉树存为字符串,我们自己定义一套规则,比如分隔符,遍历顺序等;然后反序列化也要和我们的序列化方式配套使用。
这里我们可以都使用前序遍历的方式来序列化和反序列化。
对于二叉树的序列化,我们就按前序遍历的顺序把二叉树的值存储为字符串,节点值和节点值之间我们用逗号分割,如果遇到空节点我们就用#号代替;
对于反序列化,拿到我们自己生成的序列化结果后,我们首先就按逗号分割得到列表,然后因为这个列表序列是以前序遍历的顺序生成的,我们逐一pop(0)出第一个元素,我们拿到的第一个值就是“中”节点了,我们根据这个值创建一个节点后,先把其left交给递归(下一个就是左),再把right交给递归(再下一个就是右),最终返回这个根节点。
代码:
class Codec:
def serialize(self, root):#前序遍历 字符串化
res=['']#res其实就是一个字符串,加列表只是为了变成全局变量
def se(root):#用前序遍历的方式递归root
if not root:#base case:如果是空节点
res[0]+='#,'#空节点在字符串中用‘#’号表示
return
res[0]+=(str(root.val)+',')#把当前的值转化为字符串加入结果res,加分隔符‘,’
#按前序遍历的顺序:中结束了 左和右
se(root.left)
se(root.right)
se(root)
return res[0]
def deserialize(self, data):#将序列逐一弹出,逐一构建
#把字符串变成列表
data = data.strip(',').split(',')#先把最后的’,’去掉,再按’,’分割。
#逐一pop(0)弹出来操作,data也跟着变化
def de(data):
if not data:return None
root=data.pop(0)#要从第一个开始弹出
if root=='#':#如果弹出的是空,则返回None
return None
#否则,即弹出的是数字,就建立一个节点
root=TreeNode(int(root))
#因为data是中左右的顺序,每次都会把头去掉,所以可以直接下面这样遍历
#这个时候data已经变化了,头没了,接下来是left
root.left=de(data)
#left结束了,接下来部分也就是right所以前序遍历非常方便
root.right=de(data)
return root#返回中节点
return de(data)
小结:
我没有在题目中给的serialize和deserialize函数模板中直接写递归函数,因为我们需要提前处理一下再送入递归,这样感觉方便一些。如果需要直接用类函数来递归的话,我们需要加上’self.’来调用自身,如self.serialize(),self.deserialize。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了