需求
将 Tree 序列化后再反序列化还原
树结构如下:
class TreeNode {
public val: Number;
public left: TreeNode | null;
public right: TreeNode | null;
constructor(val: Number) {
this.val = val;
this.left = this.right = null;
}
}
思路
树序列化需要经过遍历
选定一种遍历:前序遍历
序列化的过程需要考虑两个,一个是元素本身的分隔,一个 null 的标识
- 元素本身需要一个标识,','
- null 的标识,'~'
- 遍历顺序:根+左+右(类似情况递归即可)
Show Code
// 序列化-前序遍历
const serialize = (root: TreeNode | null): string => {
if(root === null) {
return '~'; // flag
}
return root.val + ',' + serialize(root.left) + ',' + serialize(root.right)
}
// 反序列化-前序遍历
const deserialize = (val: string): TreeNode | null => {
const data = val.split(',');
const _walk = (arr: string[]) => {
if(!arr.length) return null;
const cur = arr.shift();
if(cur === '~') return null;
const node = new TreeNode(Number(cur));
node.left = _walk(arr);
node.right = _walk(arr);
return node;
}
return _walk(data);
}
// test
/**
数据源
TreeNode {
val: 1,
right: TreeNode {
val: 3,
right: TreeNode { val: 5, right: null, left: null },
left: TreeNode { val: 4, right: null, left: null }
},
left: TreeNode { val: 2, right: null, left: null }
}
序列化
1,2,~,~,3,4,~,~,5,~,~
*/
const node = new TreeNode(1);
node.left = new TreeNode(2);
node.right = new TreeNode(3);
node.right.left = new TreeNode(4);
node.right.right = new TreeNode(5);
console.log(node)
console.log(serialize(node)) // 1,2,~,~,3,4,~,~,5,~,~
console.log(deserialize(serialize(node)))