美文网首页
LeetCode 449. Serialize and Dese

LeetCode 449. Serialize and Dese

作者: 微微笑的蜗牛 | 来源:发表于2020-04-19 10:35 被阅读0次

    @(LeetCode)

    问题描述

    序列化是将数据或者对象转换为二进制的过程,因此可以被存储在文件或者内存中,或是通过网络进行传输,在同一台或者另一台电脑上可被重新恢复为原来的数据。

    设计一个算法来序列化和反序列化二叉搜索树。对于算法没有任何限制。只需要保证将二叉搜索树序列化为字符串,并且该字符串可被反序列化成原先的树结构。

    序列化后的字符串应该尽量紧凑。

    注意:不要使用类中的成员/全局/静态变量来存储状态。序列化和反序列化应该是无状态的。

    想看英文原文的戳这里

    解题思路

    解此题的关键是利用二叉搜索树的相关性质,即:

    • 左子树的值 < 父节点的值。
    • 右子树的值 > 父节点的值。

    若要重建二叉搜索树,只需将节点一个个的按照规则进行插入即可。但是节点的插入顺序是影响重建的重要因素。因此,在序列化时,遍历的顺序比较重要。

    其中满足条件的遍历方式有两种:

    • 先序遍历
    • 层遍历

    至于为什么是这两种,可使用各种遍历方式自行分析一下,比较简单。

    所以解题步骤如下:

    1. 采用先序/层遍历方式,将节点值存储下来。
    2. 构建二叉搜索树。根据这些节点值,不断的将其插入到二叉搜索树中。

    下面给出先序遍历的解法,以 - 连接节点。

    var serialize = function (root) {
      if (root) {
        return `-${root.val}` + serialize(root.left) + serialize(root.right)
      }
    
      return ''
    };
    

    反序列化:

    var deserialize = function (data) {
      let str = data
      if (str && str.length > 0) {
        // 去除首个 -,因为 split 后是空格
        if (str.startsWith('-')) {
          str = str.substring(1, str.length)
        }
    
        let array = str.split('-')
    
        if (array.length >= 1) {
    
          let root = null
          let i = 0
          while (i < array.length) {
            // 将节点逐个插入
            root = buildTree(root, parseInt(array[i]))
            i += 1
          }
    
          return root
        }
      }
    
      return null
    };
    
    // 构建树
    var buildTree = function (root, val) {
      if (!root) {
        return new TreeNode(val)
      }
    
      if (val < root.val) {
        root.left = buildTree(root.left, val)
      } else {
        root.right = buildTree(root.right, val)
      }
    
      return root
    }
    

    完整代码可点此查看

    相关文章

      网友评论

          本文标题:LeetCode 449. Serialize and Dese

          本文链接:https://www.haomeiwen.com/subject/wlyybhtx.html