# 题目

请实现两个函数,分别用来序列化和反序列化二叉树

# 思路

  • 若一颗二叉树是不完全的,我们至少需要两个遍历才能将它重建(像题目重建二叉树一样)
  • 但是这种方式仍然有一定的局限性,比如二叉树中不能出现重复节点。
  • 如果二叉树是一颗完全二叉树,我们只需要知道前序遍历即可将它重建。
  • 因此在序列化时二叉树时,可以将空节点使用特殊符号存储起来,这样就可以模拟一棵完全二叉树的前序遍历
  • 在重建二叉树时,当遇到特殊符号当空节点进行处理

# 代码

    function Serialize(pRoot, arr = []) {
      if (!pRoot) {
        arr.push('#');
      } else {
        arr.push(pRoot.val);
        Serialize(pRoot.left, arr)
        Serialize(pRoot.right, arr)
      }
      return arr.join(',');
    }

    function Deserialize(s) {
      if (!s) {
        return null;
      }
      return deserialize(s.split(','));
    }

    function deserialize(arr) {
      let node = null;
      const current = arr.shift();
      if (current !== '#') {
        node = { val: current }
        node.left = deserialize(arr);
        node.right = deserialize(arr);
      }
      return node;
    }

# 考察点

  • 二叉树
  • 复杂问题拆解