题目描述
你能否对二叉树进行序列化和反序列化?就像 JSON.stringify() 和 JSON.parse() 所做的那样。题目链接
const tree1 = ...
expect(typeof serialize(tree1)).toBe('string')
const tree2 = deserialize(serialize(tree1))
expect(isIdentical(tree1, tree2)).toBe(true)
思路分析
我们需要完成两个任务,序列化和反序列化
class Node {
value: string
left: null | Node
right: null | Node
constructor(val) { <=> [1,2,3,4,null,null,5,6,7,8,null,null,null,null,9]
this.value = val
this.left = null
this.right = null
}
}
序列化只需要对 Node 深度优先遍历即可
function serialize(node) {
if (!root) {
return 'null';
}
return `${root.value}, ${serialize(root.left), ${serialize(root.right)}}`;
}
反序列化,可以通过观察序列化的数组 [1,2,3,4,null,null,5,6,7,8,null,null,null,null,9]
从第0个开始,对应的value left right 分别为1、2、3,说明核心函数是把数组第0项作为 value,第1项作为 left.value,第2项作为 right.value,第3项作为left.left.value
因此我们每一次操作都是赋值value,并且取出队列中的第0项
function deserialize(str) {
const q = str.split(',');
return dfs(q);
function dfs(que) {
if (!que.length) {
return null;
}
const n = que.shift();
if (n !== 'null') {
const node = new Node(n);
node.left = dfs(que);
node.right = dfs(que);
return node;
}
return null;
}
}
AC代码
// class Node {
// value: number
// left: null | Node
// right: null | Node
// constructor(val) {
// this.value = val
// this.left = null
// this.right = null
// }
// }
/**
* @param {Node} root
* @return {string}
*/
function serialize(root) {
if (!root) {
return 'null';
}
return `${root.val},${serialize(root.left)},${serialize(root.right)}`;
}
/**
* @param {string} str
* @return {Node}
*/
function deserialize(str) {
const q = str.split(',');
return dfs(q);
function dfs(que) {
if (!que.length) {
return null;
}
const n = que.shift();
if (n !== 'null') {
const node = new Node(n);
node.left = dfs(que);
node.right = dfs(que);
return node;
}
return null;
}
}
总结
处理二叉树问题,可以利用 array.shift() 这样保证取出第0项并且取出原数据第0项
本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情