LeetCode题解:297. 二叉树的序列化与反序列化,DFS,JavaScript,详细注释

原题链接:https://leetcode-cn.com/problems/serialize-and-deserialize-binary-tree/

解题思路:

  1. 参考了『手画图解』剖析DFS、BFS解法 | 二叉树的序列化与反序列化
  2. 该题实际上并没有严格的要求将二叉树序列化为[1,2,3,null,null,4,5]的形式,只要能够输出为1,2,X,X,3,4,X,X,5,X,X(X表示节点为null),并且重新反序列化为二叉树即可。
  3. 序列化:
    • 使用DFS遍历每个节点。
    • 如果遇到节点为空,则返回X。
    • 如果节点有值,则将其和左右子树,按照根、左、右的顺序拼接成字符串。
  4. 反序列化:
    • 由于已经按照根、左、右的顺序,对二叉树进行了序列化,只要按照这个顺序递归生成二叉树即可。
    • 将序列化的字符串转换成数组,每次递归都出队一个值,就保证了根、左、右的顺序。
    • 如果出队的值为X,则生成一个null,并将其返回。
    • 如果出队的是正常值,则用其创建一个节点,并将其与递归生成的左右子树连接成二叉树。
/**
 * 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) {
  // 如果节点为空,使用一个特定的字符标识
  if (!root) {
    return 'X';
  }

  // 每次递归都获取左右子树的序列化结果
  const left = serialize(root.left);
  const right = serialize(root.right);

  // 将当前二叉树按照根,左,右的方式拼接
  return `${root.val},${left},${right}`;
};

/**
 * Decodes your encoded data to tree.
 *
 * @param {string} data
 * @return {TreeNode}
 */
var deserialize = function(data) {
  // 将序列化的字符串,转换为数组
  const valList = data.split(',');

  // 生成二叉树的方法
  function build() {
    // 由于二叉树已经按照根、左、右的顺序序列化,每次递归只需要按顺序取出每个节点的值即可
    const val = valList.shift();

    // 如果当前值为X,表示此节点为空,直接返回null
    if (val === 'X') {
      return null;
    }

    // 使用当前值生成一个节点
    const node = new TreeNode(val);

    // 由于子节点都是按照先左后右的顺序取出,因此按照同样顺序将子节点连接到根节点即可
    node.left = build();
    node.right = build();

    // 将当前生成的节点返回,供上一层递归生成树
    return node;
  }

  return build();
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值