LeetCode 297.序列化二叉树 - JavaScript

题目描述

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

请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。

说明: 不要使用类的成员 / 全局 / 静态变量来存储状态,你的序列化和反序列化算法应该是无状态的。

序列化二叉树思路

使用广度优先(BFS)遍历所有节点(包括空节点),整体流程如下:

  1. 初始化字符串 res
  2. 初始化队列 queue,将 root 放入队列
  3. 检查队列是否为空:
    • 队列不为空:取出队首节点,如果节点为 null,那么 res 更新为 res + ‘#,‘;如果节点不是 null,那么 res 更新为 res + val,并且将节点的左右节点依次加入 queue。继续循环。
    • 队列为空:结束循环
  4. 返回"[" + res + "]"
    1
   /   2   3
     /     4   5

以上面这棵二叉树为例,它的序列化结果是"[1,2,3,#,#,4,5,#,#,#,#]"

序列化的代码实现如下:

// ac地址:https://leetcode-cn.com/problems/xu-lie-hua-er-cha-shu-lcof/
// 原文地址:https://xxoo521.com/2020-02-13-serialize-and-deserialize-btree/

/**
 * Encodes a tree to a single string.
 *
 * @param {TreeNode} root
 * @return {string}
 */
var serialize = function(root) {
    if (!root) {
        return "[]";
    }

    let res = "";
    let node = root;
    const queue = [node];
    while (queue.length) {
        const front = queue.shift();
        if (front) {
            res += `${front.val},`;
            queue.push(front.left);
            queue.push(front.right);
        } else {
            res += "#,";
        }
    }

    res = res.substring(0, res.length - 1); // 去掉最后一个逗号

    return `[${res}]`;
};

反序列化二叉树思路

以前面的二叉树为例,反序列话就是将字符串"[1,2,3,#,#,4,5,#,#,#,#]"重新还原成原来的二叉树。

反序列化流程如下:

  • 去掉字符串 res 前后的[],并将其按照,逗号切分得到数组 nodes
  • 初始化队列 queue,放入 nodes 的第一个值对应的节点,nodes 弹出第一个值
  • 检查队列是否为空:
    • 队列不为空。从 queue 取出队首元素。从 nodes 中取出第一个值和第二值,依次处理。继续循环。
    • 队列为空。结束循环。
  • 返回根节点。

反序列化函数的设计关键是:数组 nodes 取出元素的顺序和原二叉树层序遍历的顺序是对应的。

反序列的函数实现如下:

// ac地址:https://leetcode-cn.com/problems/xu-lie-hua-er-cha-shu-lcof/
// 原文地址:https://xxoo521.com/2020-02-13-serialize-and-deserialize-btree/

/**
 * Decodes your encoded data to tree.
 *
 * @param {string} data
 * @return {TreeNode}
 */
var deserialize = function(data) {
    if (data.length <= 2) {
        return null;
    }

    const nodes = data.substring(1, data.length - 1).split(",");
    const root = new TreeNode(parseInt(nodes[0]));
    nodes.shift();

    const queue = [root];
    while (queue.length) {
        const node = queue.shift();
        // 第一个是左节点,节点为空,直接跳过
        const leftVal = nodes.shift();
        if (leftVal !== "#") {
            node.left = new TreeNode(leftVal);
            queue.push(node.left);
        }
        // 第二个是右节点,节点为空,直接跳过
        const rightVal = nodes.shift();
        if (rightVal !== "#") {
            node.right = new TreeNode(rightVal);
            queue.push(node.right);
        }
    }

    return root;
};

更多资料

原文地址:https://www.cnblogs.com/geyouneihan/p/12315432.html

时间: 2024-08-28 21:48:07

LeetCode 297.序列化二叉树 - JavaScript的相关文章

LeetCode 101.对称二叉树 - JavaScript

题目描述:给定一个二叉树,检查它是否是镜像对称的. 题目分析 下面这种二叉树就是镜像对称的,符合题目要求: 1 / 2 2 / \ / 3 4 4 3 解法 1:递归检查 根据题目"对称"的定义,递归过程如下: 对称节点的 val 是否相同 依次递归对称节点的 left1 和 right2.right1 和 left2(结合上面的例子更好理解) 代码实现如下: // ac地址:https://leetcode-cn.com/problems/symmetric-tree/ // 原文地

Leetcode 297.二叉树的序列化和反序列化

二叉树地序列化和反序列化 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据. 请设计一个算法来实现二叉树的序列化与反序列化.这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构. 示例:  你可以将以下二叉树: 序列化为 "[1,2,3,null,null,4,5]" 提示: 这与 Le

序列化二叉树-剑指Offer

序列化二叉树 题目描述 请实现两个函数,分别用来序列化和反序列化二叉树 思路 序列化就按先序遍历,遇到空指针也要存下来,递归调用,StringBuilder 反序列化是同样的递归调用,不过要考虑参数的传递,生成的TreeNode要返回 注意:对Sting[]的遍历,每次递归都要往后遍历一个字符,如果将这个位置信息point通过参数传入的话,就会造成函数无法正常遍历String[],此时,我们可以将位置信息设置为类的成员变量,每次递归时都要递增,这样既可满足条件 代码 /* public clas

Leetcode:Path Sum 二叉树路径和

Path Sum: Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all the values along the path equals the given sum. For example:Given the below binary tree and sum = 22, 5 / 4 8 / / 11 13 4 / \ 7 2 1 return

20.2 解析与序列化【JavaScript高级程序设计第三版】

JSON 之所以流行,拥有与JavaScript 类似的语法并不是全部原因.更重要的一个原因是,可以把JSON 数据结构解析为有用的JavaScript 对象.与XML 数据结构要解析成DOM 文档而且从中提取数据极为麻烦相比,JSON 可以解析为JavaScript 对象的优势极其明显.就以上一节中包含一组图书的JSON数据结构为例,在解析为JavaScript 对象后,只需要下面一行简单的代码就可以取得第三本书的书名: books[2].title 当然,这里是假设把解析JSON 数据结构后

剑指Offer——序列化二叉树

题目描述: 请实现两个函数,分别用来序列化和反序列化二叉树 分析: 先序遍历可以用来序列化二叉树,序列化过程中,我们用"0xFFFFFFFF"表示结点为NULL. 反序列化便很简单,遇到"0xFFFFFFFF"就返回NULL,其他时候就直接产生一个结点. 代码: 1 /* 2 struct TreeNode { 3 int val; 4 struct TreeNode *left; 5 struct TreeNode *right; 6 TreeNode(int x

※剑指offer系列50:序列化二叉树

先来说一下什么是序列化二叉树,就是把二叉树转换成一串序列.反序列化就是将一串序列构造成一个二叉树. 这个题我也不是很懂,为什么要这样写 1 class Solution { 2 public: 3 vector<int> aux; 4 void treetovec(TreeNode * root) 5 { 6 if (!root)//空节点 7 { 8 aux.push_back(0xFFFFFFFF); 9 } 10 else { 11 aux.push_back(root->val)

剑指Offer对答如流系列 - 序列化二叉树

面试题37:序列化二叉树 题目描述 请实现两个函数,分别用来序列化和反序列化二叉树. 树的结构定义如下: public class Node { int val = 0; Node left = null; Node right = null; public Node(int val) { this.val = val; } } 问题分析 一般情况下,需要采用前/后序遍历和中序遍历才能确定一个二叉树,具体的内容我们之前探讨过 剑指Offer对答如流系列 - 重建二叉树 但是采用这种方式进行序列化

50.序列化二叉树

代码 序列化二叉树 原文地址:https://www.cnblogs.com/make-big-money/p/12316231.html