1、树序列化和反序列化是什么意思???
我们先来看下什么是序列化,以下定义来自维基百科:
❝ 序列化(serialization)在计算机科学的数据处理中,是指将数据结构或对象状态转换成可取用格式(例如存成文件,存于缓冲,或经由网络中发送),以留待后续在相同或另一台计算机环境中,能恢复原先状态的过程。依照序列化格式重新获取字节的结果时,可以利用它来产生与原始对象相同语义的副本。对于许多对象,像是使用大量引用的复杂对象,这种序列化重建的过程并不容易。面向对象中的对象序列化,并不概括之前原始对象所关系的函数。这种过程也称为对象编组(marshalling)。从一系列字节提取数据结构的反向操作,是反序列化(也称为解编组、deserialization、unmarshalling)。
❞
可见,序列化和反序列化在计算机科学中的应用还是非常广泛的。就拿 LeetCode 平台来说,其允许用户输入形如:
[1,2,3,null,null,4,5]
这样的数据结构来描述一颗树:
其实序列化和反序列化只是一个概念,不是一种具体的算法,而是很多的算法。并且针对不同的数据结构,算法也会不一样。本文主要讲述的是二叉树的序列化和反序列化。看完本文之后,你就可以放心大胆地去 AC 以下两道题:
2、开始做题啦
咱们这里使用 中序遍历,queue.push()有可能推入的是null,所以在循环体内作出判断,如果node为null,则直接给res推入一个null
var serialize = function(root) {
if (!root) return JSON.stringify([]);
let res = [];
let queue = [root];
while (queue.length) {
let node = queue.shift();
if (node !== null) {
res.push(node.val);
queue.push(node.left);
queue.push(node.right);
} else {
res.push(null)
}
}
return JSON.stringify(res);
};
var deserialize = function(data) {
if (data === '[]') return null;
let arr = JSON.parse(data);
let root = new TreeNode(arr[0]);
let queue = [root];
let i = 1;
while (queue.length){
let node = queue.shift();
if (arr[i] !== null) {
node.left = new TreeNode(arr[i]);
queue.push(node.left);
}
i++;
if (arr[i] !== null) {
node.right = new TreeNode(arr[i]);
queue.push(node.right);
}
i++;
}
return root;
};
添加下面代码 开始调试代码
var obj = {
val: 1,
left: {
val: 2,
left: null,
right: null
},
right: {
val: 3,
left: {
val:4,
left:null,
right:null
},
right: {
val:5,
left:null,
right:null
}
},
};
console.log(serialize(obj));
//输出数组为 '[1,2,3,null,null,4,5,null,null,null,null]'
添加下面代码