剑指 Offer II 048. 序列化与反序列化二叉树

84 阅读1分钟

剑指 Offer II 048. 序列化与反序列化二叉树

序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。

请设计一个算法来实现二叉树的序列化与反序列化。只需要保证二叉树可以被序列化为一个字符串,且将这个字符串反序列化为原始的树结构

序列化代码如下

将所有节点放入数组中,如果节点为空,则将#插入数组中,然后用逗号合并为一个字符串

var serialize = (root) => {
  var queue = [root];
  var res = [];
  while (queue.length) {
    var node = queue.shift();
    if (node) {
      res.push(node.val);
      queue.push(node.left);
      queue.push(node.right);
    } else {
      res.push("#");
    }
  }
  return res.join(",");
};

反序列化代码如下

  • 反序列化将数组展开,首位是根节点
  • 用变量len代表处理arr的位置
  • 左数 var left = arr[len]
  • 右边树 var right = arr[len + 1] 遇到#了,就不用管它,因为在new TreeNode的时候已经初始化了左右节点 如果不是#,则挂载上去就行了
var deserialize = (data) => {
  if (data == "#") return null;
  var arr = data.split(",");
  var root = new TreeNode(arr[0]);
  var queue = [root];
  var len = 1;
  while (len < arr.length) {
    var node = queue.shift();
    var left = arr[len];
    var right = arr[len + 1];
    if (left != "#") {
      var leftNode = new TreeNode(left);
      node.left = leftNode;
      queue.push(leftNode);
    }
    if (right != "#") {
      var rightNode = new TreeNode(right);
      node.right = rightNode;
      queue.push(rightNode);
    }
    len += 2;
  }
  return root;
};