前端嘛 Logo
前端嘛

0297.二叉树的序列化与反序列化

题目链接

题目大意

二叉树的序列化与反序列化

思路与代码

广度优先遍历

/**
 * 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) {
  let ret = [];
  const queue = [root];
  while (queue.length) {
    const n = queue.length;
    for (let i = 0; i < n; i++) {
      const node = queue.shift();
      if (node) {
        ret.push(node.val);
        queue.push(node.left);
        queue.push(node.right);
      } else {
        ret.push(null);
      }
    }
  }
  while (ret[ret.length - 1] === null) {
    ret.pop();
  }
  return ret.toString();
};

/**
 * Decodes your encoded data to tree.
 *
 * @param {string} data
 * @return {TreeNode}
 */
var deserialize = function (data) {
  if (!data.length) return null;
  const arr = data.split(',').map((e) => (e ? new TreeNode(Number(e)) : null));
  const root = arr.shift();
  let queue = [root];
  let nextQueue = [];
  while (arr.length) {
    for (let i = 0; i < queue.length; i++) {
      if (arr[0]) {
        queue[i].left = arr[0];
        nextQueue.push(arr[0]);
      }
      arr.shift();
      if (arr[0]) {
        queue[i].right = arr[0];
        nextQueue.push(arr[0]);
      }
      arr.shift();
    }
    queue = nextQueue;
    nextQueue = [];
  }
  return root;
};

/**
 * Your functions will be called as such:
 * deserialize(serialize(root));
 */
  • 空间复杂度:O(n)

  • 时间复杂度:O(n)

深度优先遍历

/**
 * 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) {
  return se(root, '');
};

const se = (node, ret) => {
  if (!node) {
    ret += 'None,';
  } else {
    ret += node.val + ',';
    ret = se(node.left, ret);
    ret = se(node.right, ret);
  }

  return ret;
};

/**
 * Decodes your encoded data to tree.
 *
 * @param {string} data
 * @return {TreeNode}
 */
var deserialize = function (data) {
  return de(data.split(','));
};

const de = (dataList) => {
  if (dataList[0] === 'None') {
    dataList.shift();
    return null;
  }
  const root = new TreeNode(parseInt(dataList[0]));
  dataList.shift();
  root.left = de(dataList);
  root.right = de(dataList);
  return root;
};
/**
 * Your functions will be called as such:
 * deserialize(serialize(root));
 */
  • 空间复杂度:O(n)

  • 时间复杂度:O(n)