LeetCode 297:二叉树的序列化与反序列化
一、问题背景与核心挑战
在分布式系统、数据存储和网络传输中,我们经常需要将复杂的数据结构(如二叉树)转换为可存储或传输的格式,这一过程称为序列化;而从序列化后的格式还原出原始数据结构的过程则称为反序列化。
对于二叉树而言,核心挑战在于:
- 结构唯一性:必须完整记录树的结构,包括空节点,否则不同的树可能产生相同的序列化结果,导致反序列化时无法唯一还原。
- 效率平衡:在保证结构完整性的同时,兼顾序列化和反序列化的时间与空间效率。
例如,仅记录非空节点的序列 "1,2,3" 无法区分以下两棵树:
1 1
/ \ / \
2 3 2 3
因此,空节点的记录是实现唯一还原的关键。
二、核心思路:层序遍历(BFS)的直观实现
为了直观且高效地解决问题,我们选择**层序遍历(BFS)**作为核心方法,原因如下:
- 层序遍历按'从上到下、从左到右'的顺序访问节点,每个节点的左右子节点位置明确,便于构建和还原。
- 与 LeetCode 官方的二叉树输入格式完全一致,降低理解和调试成本。
核心思想
- 序列化:用队列模拟层序遍历,将每个节点(包括空节点)转换为字符串,空节点用
"null"表示,最终拼接为逗号分隔的字符串。 - 反序列化:将字符串按逗号分割为数组,用队列模拟层序构建树,依次为每个节点分配左右子节点,空节点直接跳过。
三、序列化步骤详解
1. 初始化与队列处理
- 若根节点为空,直接返回
"null"。 - 初始化队列,将根节点入队。
- 初始化
StringBuilder用于拼接结果。
2. 遍历与记录
- 从队列中取出节点:
- 若节点为空,向结果中添加
"null,"。 - 若节点非空,添加节点值,并将其左右子节点(无论是否为空)入队。
- 若节点为空,向结果中添加
- 遍历结束后,移除结果末尾多余的逗号。
示例演示(示例 1)
输入树:[1,2,3,null,null,4,5]
序列化过程:
| 队列状态 | 取出节点 | 记录内容 | 入队子节点 |
|---|---|---|---|
| [1] | 1 | "1," | [2, 3] |
| [2, 3] | 2 | "2," | [3, null, null] |
| [3, null, null] | 3 | "3," | [null, null, 4, 5] |
| [null, null, 4, 5] | null | "null," | [null, 4, 5] |
| [null, 4, 5] | null | "null," | [4, 5] |


