https://leetcode-cn.com/problems/serialize-and-deserialize-binary-tree/
/*** 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) {const queue = [root];let res = [];while (queue.length) {const node = queue.shift(); // 考察出列的节点if (node) { // 是真实节点,带出子节点入列res.push(node.val); // 节点值推入resqueue.push(node.left); // 子节点入列,不管是不是null节点都入列queue.push(node.right);} else { // 是null节点,没有子节点入列res.push('X'); // X 推入res}}return res.join(','); // 转成字符串};/*** Decodes your encoded data to tree.** @param {string} data* @return {TreeNode}*/var deserialize = function(data) {if (data == 'X') return null;const list = data.split(','); // 序列化字符串split成数组const root = new TreeNode(list[0]); // 获取首项,构建根节点const queue = [root]; // 根节点推入队列let cursor = 1; // 初始指向list第二项while (cursor < list.length) { // 指针越界,即扫完了序列化字符串const node = queue.shift(); // 考察出列的节点const leftVal = list[cursor]; // 它的左儿子的值const rightVal = list[cursor + 1]; // 它的右儿子的值if (leftVal != 'X') { // 是真实节点const leftNode = new TreeNode(leftVal); // 创建左儿子节点node.left = leftNode; // 认父亲queue.push(leftNode); // 自己也是父亲,入列}if (rightVal != 'X') {const rightNode = new TreeNode(rightVal);node.right = rightNode;queue.push(rightNode);}cursor += 2; // 一次考察一对儿子,指针加2}return root; // BFS结束,构建结束,返回根节点};/*** Your functions will be called as such:* deserialize(serialize(root));*/
function serialize(root: TreeNode | null): string {let res: string = '['let queue: TreeNode[] = []if (root === null) return ''queue.push(root)while (queue.length) {let curr = queue.pop()!if (curr === null) res += 'null'else {res += curr.val + ','if (curr.left) queue.push(curr.left)if (curr.right) queue.push(curr.right)}}res.substring(0, res.length - 1);res += ']'return res};function deserialize(data: string): TreeNode | null {let str = data.substring(1, data.length - 1);let arr = str.split(',')let root = new TreeNode(Number(arr[0]))let queue: TreeNode[] = []let parent: TreeNode = root // 当前节点的父节点let isLeft = true; // 是不是左边节点for (let i = 1; i < arr.length; i++) {let curr = getNode(arr[i])if (isLeft) parent.left = currelse parent.right = currif (curr != null){queue.push(curr)}isLeft = !isLeftif (isLeft) queue.pop()}return root};function getNode(val: string): TreeNode | null {if (val === 'null') {return null} else {return new TreeNode(Number(val))}}
