序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。
请设计一个算法来实现二叉树的序列化与反序列化。只需要保证二叉树可以被序列化为一个字符串,且将这个字符串反序列化为原始的树结构。
序列化代码如下
将所有节点放入数组中,如果节点为空,则将#插入数组中,然后用逗号合并为一个字符串
var serialize = (root) => {
var queue = [root];
var res = [];
while (queue.length) {
var node = queue.shift();
if (node) {
res.push(node.val);
queue.push(node.left);
queue.push(node.right);
} else {
res.push("#");
}
}
return res.join(",");
};
反序列化代码如下
- 反序列化将数组展开,首位是根节点
- 用变量len代表处理arr的位置
- 左数
var left = arr[len] - 右边树
var right = arr[len + 1]遇到#了,就不用管它,因为在new TreeNode的时候已经初始化了左右节点 如果不是#,则挂载上去就行了
var deserialize = (data) => {
if (data == "#") return null;
var arr = data.split(",");
var root = new TreeNode(arr[0]);
var queue = [root];
var len = 1;
while (len < arr.length) {
var node = queue.shift();
var left = arr[len];
var right = arr[len + 1];
if (left != "#") {
var leftNode = new TreeNode(left);
node.left = leftNode;
queue.push(leftNode);
}
if (right != "#") {
var rightNode = new TreeNode(right);
node.right = rightNode;
queue.push(rightNode);
}
len += 2;
}
return root;
};