LCR 048.二叉树的序列化与反序列化
序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。
请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。
示例 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]
提示:
- 输入输出格式与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,也可以采用其他的方法解决这个问题。
- 树中结点数在范围
[0, 104]
内 -1000 <= Node.val <= 1000
法1:递归
分析:
二叉树的序列化(树转为序列)
- 空节点使用#代替
- 返回根结点的值、左节点的值、右节点的值
反序列化(序列转为树)
- 将数组使用逗号分割开,获取数组
- 遇到#,则返回null
- 否则,就设置为str的结点,最后返回节点
js
function TreeNode(val) {
this.val = val;
this.left = this.right = null;
}
var serialize = function(root) {
if(root === null) return "#"; // 用 # 表示空节点
let leftStr = serialize(root.left);
let rightStr = serialize(root.right);
return `${root.val},${leftStr},${rightStr}`; // 使用逗号连接值
};
var deserialize = function(data) {
const nodeStrs = data.split(",");
let index = 0;
return dfs(nodeStrs);
function dfs(strs){
let str = strs[index++];
if(str === "#") return null;
let node = new TreeNode(parseInt(str));
node.left = dfs(strs);
node.right = dfs(strs);
return node;
}
};