750 字
4 分钟
二叉树的序列化与反序列化

题目描述
序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。
请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。
提示: 输入输出格式与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。
解题思路
- 序列化策略:
- 使用前序遍历(根-左-右)递归序列化
- 空节点用特殊标记(如”X”)表示
- 节点值之间用分隔符(如”,“)连接
- 反序列化策略:
- 按分隔符拆分序列化字符串
- 递归构建二叉树:首元素为根节点
- 后续元素递归构建左右子树
- 边界处理:
- 空树序列化为特殊标记
- 反序列化时处理非法输入
- 替代方案:
- 层序遍历序列化(队列实现)
- 中序+前序组合序列化(需两个序列)
关键洞察
- 序列完整性:
- 必须包含空节点信息才能唯一确定树结构
- 分隔符避免数值歧义
- 递归对称性:
- 序列化顺序决定反序列化顺序
- 前序遍历自然匹配递归构建过程
- 数据压缩:
- 省略尾随空节点减少序列长度
- 兼容性设计:
- 选择可逆编码方案
- 处理负数和浮点数情况
复杂度分析
操作 | 时间复杂度 | 空间复杂度 | 说明 |
---|---|---|---|
序列化 | O(n) | O(n) | 递归栈空间+结果字符串 |
反序列化 | O(n) | O(n) | 递归栈空间+节点存储 |
层序实现 | O(n) | O(n) | 队列空间占用 |
注:n 为节点数,h 为树高度(最坏情况 O(n))
代码实现
var serialize = function (root) { const result = []; const serializeHelper = (node) => { if (!node) { result.push('N'); return; } result.push(node.val); serializeHelper(node.left); serializeHelper(node.right); }; serializeHelper(root); return result.join(',');};
var deserialize = function (data) { const values = data.split(','); let index = 0; const deserializeHelper = () => { if (values[index] === 'N') { index++; return null; } const node = new TreeNode(parseInt(values[index])); index++; node.left = deserializeHelper(); node.right = deserializeHelper(); return node; }; return deserializeHelper();};
实际应用场景
- 分布式系统:跨网络传输二叉树结构`
- 数据库存储:树形结构数据持久化`
- 前端状态管理:保存/恢复UI组件树状态`
- 算法测试:生成测试用例树结构`