https://leetcode-cn.com/problems/serialize-and-deserialize-binary-tree/

    1. /**
    2. * Definition for a binary tree node.
    3. * function TreeNode(val) {
    4. * this.val = val;
    5. * this.left = this.right = null;
    6. * }
    7. */
    8. /**
    9. * Encodes a tree to a single string.
    10. *
    11. * @param {TreeNode} root
    12. * @return {string}
    13. */
    14. var serialize = function(root) {
    15. const queue = [root];
    16. let res = [];
    17. while (queue.length) {
    18. const node = queue.shift(); // 考察出列的节点
    19. if (node) { // 是真实节点,带出子节点入列
    20. res.push(node.val); // 节点值推入res
    21. queue.push(node.left); // 子节点入列,不管是不是null节点都入列
    22. queue.push(node.right);
    23. } else { // 是null节点,没有子节点入列
    24. res.push('X'); // X 推入res
    25. }
    26. }
    27. return res.join(','); // 转成字符串
    28. };
    29. /**
    30. * Decodes your encoded data to tree.
    31. *
    32. * @param {string} data
    33. * @return {TreeNode}
    34. */
    35. var deserialize = function(data) {
    36. if (data == 'X') return null;
    37. const list = data.split(','); // 序列化字符串split成数组
    38. const root = new TreeNode(list[0]); // 获取首项,构建根节点
    39. const queue = [root]; // 根节点推入队列
    40. let cursor = 1; // 初始指向list第二项
    41. while (cursor < list.length) { // 指针越界,即扫完了序列化字符串
    42. const node = queue.shift(); // 考察出列的节点
    43. const leftVal = list[cursor]; // 它的左儿子的值
    44. const rightVal = list[cursor + 1]; // 它的右儿子的值
    45. if (leftVal != 'X') { // 是真实节点
    46. const leftNode = new TreeNode(leftVal); // 创建左儿子节点
    47. node.left = leftNode; // 认父亲
    48. queue.push(leftNode); // 自己也是父亲,入列
    49. }
    50. if (rightVal != 'X') {
    51. const rightNode = new TreeNode(rightVal);
    52. node.right = rightNode;
    53. queue.push(rightNode);
    54. }
    55. cursor += 2; // 一次考察一对儿子,指针加2
    56. }
    57. return root; // BFS结束,构建结束,返回根节点
    58. };
    59. /**
    60. * Your functions will be called as such:
    61. * deserialize(serialize(root));
    62. */
    1. function serialize(root: TreeNode | null): string {
    2. let res: string = '['
    3. let queue: TreeNode[] = []
    4. if (root === null) return ''
    5. queue.push(root)
    6. while (queue.length) {
    7. let curr = queue.pop()!
    8. if (curr === null) res += 'null'
    9. else {
    10. res += curr.val + ','
    11. if (curr.left) queue.push(curr.left)
    12. if (curr.right) queue.push(curr.right)
    13. }
    14. }
    15. res.substring(0, res.length - 1);
    16. res += ']'
    17. return res
    18. };
    19. function deserialize(data: string): TreeNode | null {
    20. let str = data.substring(1, data.length - 1);
    21. let arr = str.split(',')
    22. let root = new TreeNode(Number(arr[0]))
    23. let queue: TreeNode[] = []
    24. let parent: TreeNode = root // 当前节点的父节点
    25. let isLeft = true; // 是不是左边节点
    26. for (let i = 1; i < arr.length; i++) {
    27. let curr = getNode(arr[i])
    28. if (isLeft) parent.left = curr
    29. else parent.right = curr
    30. if (curr != null){
    31. queue.push(curr)
    32. }
    33. isLeft = !isLeft
    34. if (isLeft) queue.pop()
    35. }
    36. return root
    37. };
    38. function getNode(val: string): TreeNode | null {
    39. if (val === 'null') {
    40. return null
    41. } else {
    42. return new TreeNode(Number(val))
    43. }
    44. }