/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* Encodes a tree to a single string.
*
* @param {TreeNode} root
* @return {string}
*/
var serialize = function (root, emptyMarker = '#', seperator = ',') {
if (!root) return '';
const queue = [root];
const arr = [];
// BFS
while (queue.length) {
const node = queue.shift();
if (node) {
arr.push(node.val);
// 子节点为空也要入列,因为要标记空节点
queue.push(node.left, node.right);
} else {
// 标记空节点
arr.push(emptyMarker);
}
}
// 最后一层右侧的那些空节点标记可以删掉
// 不删也行 `return arr.join(seperator);`
return arr
.join(seperator)
.replace(new RegExp(`(${seperator}${emptyMarker})+$`), '');
};
/**
* Decodes your encoded data to tree.
*
* @param {string} data
* @return {TreeNode}
*/
var deserialize = function (data, emptyMarker = '#', seperator = ',') {
if (!data) return null;
const nodes = data.split(seperator);
const root = new TreeNode(nodes[0]);
const queue = [root];
let i = 1;
// BFS
while (queue.length) {
const node = queue.shift();
node.left = buildNode(nodes[i]);
node.left && queue.push(node.left);
i++;
node.right = buildNode(nodes[i]);
node.right && queue.push(node.right);
i++;
}
return root;
// *********************************
function buildNode(value) {
return value === void 0 || value === emptyMarker
? null
: new TreeNode(value);
}
};
/**
* Your functions will be called as such:
* deserialize(serialize(root));
*/