剑指Offer——序列化二叉树(JS实现)

简介: 剑指Offer——序列化二叉树(JS实现)

题目描述

image.png

解题思路(序列化)

  • 本题分为两个部分:一是序列化二叉树,二是反序列化二叉树。
  • 序列化二叉树:将以可二叉树,变成一个字符串,这个字符串本人刚开始以为是按照题目给的例子得是层序遍历才行,后来看了题解才知道,原来前序遍历也可以,下面的解法是采用的层序遍历,层序遍历使用的是数组存储每一层的下一层元素,然后将这个数组变成循环的条件,知道数组为空

序列化代码

const serialize = (root) => {
    if (!root) return [];
    let queue = [root];
    const res = [];
    while (queue.length !== 0) {
        const temp = [];
        for (let v of queue) {
            res.push(v);
            if (v === 'null') continue;
            if (v.left !== null) {
                temp.push(v.left);            
            } else {
                temp.push('null');
            }
            if (v.right !== null) {
                temp.push(v.right);
            } else {
                temp.push('null');
            }
        }
        queue = temp;    
    }
    let resString = ''
    for (let v of res) {
        if (v instanceof Object) {
            resString = resString + v.val + ',';
        } else {
            resString = resString + v + ',';
        }
    }
    return resString;
};

解题思路(反序列化)

  • 反序列化是本题的难点,下面的代码,以后可以作为一个常用函数,输入二叉树的层序遍历的字符串,即可生成二叉树的数据结构
  • 反序列化采用的是队列 + 多指针的思想
  • 采用一号指针指向队头指针指向原数组的位置
  • 采用二号指针指向队头指针的left和right指向原数组的位置
  • 初始时,二号指针指向下标1,一号指针指向下标0
  • 队头遍历完之后,将左右指针域的元素入队
  • 直至所有元素遍历完,结束循环,返回头指针

反序列化代码

const deserialize = (data) => {
    if (data.length === 0) return null;
    const list = data.split(',');   // split成数组
    list.splice(list.length-1);
    let list_Pointer = 1;
    let queue_pointer = 0;
    const root = new TreeNode(list[0])
    let queue = [root];
    while (list_Pointer !== list.length) {
        if (queue[0] === null) {
            queue.shift();
            queue_pointer++;
            continue;
        }
        if (queue_pointer === list_Pointer) {
            list_Pointer = list_Pointer + 2;
        }
        if (list[list_Pointer] === 'null') {
            queue[0].left = null;
        } else {
            queue[0].left = new TreeNode(list[list_Pointer]);
        }
        if (list[list_Pointer + 1] === 'null') {
            queue[0].right = null;
        } else {
            queue[0].right = new TreeNode(list[list_Pointer + 1]);
        }
        queue.push(queue[0].left);
        queue.push(queue[0].right);
        queue.shift();
        queue_pointer++
        list_Pointer = list_Pointer + 2;
    }
    return root
};

总结(本题给我们的启示思路)

  • 启示一:学会使用队列+数组进行二叉树的层序遍历
  • 启示二:学会使用队列+多指针将一个字符串生成二叉树JS的数据结构
相关文章
|
29天前
|
JSON 前端开发 JavaScript
聊聊 Go 语言中的 JSON 序列化与 js 前端交互类型失真问题
在Web开发中,后端与前端的数据交换常使用JSON格式,但JavaScript的数字类型仅能安全处理-2^53到2^53间的整数,超出此范围会导致精度丢失。本文通过Go语言的`encoding/json`包,介绍如何通过将大整数以字符串形式序列化和反序列化,有效解决这一问题,确保前后端数据交换的准确性。
35 4
|
3月前
|
存储 JSON JavaScript
「offer来了」保姆级巩固你的js知识体系(4.0w字)
该文章提供了JavaScript知识体系的全面复习资料,覆盖了从基础语法到高级特性如闭包、原型链、异步编程等多个方面,并通过大量的面试题和实例代码帮助巩固理解。
「offer来了」保姆级巩固你的js知识体系(4.0w字)
|
4月前
|
存储 算法 Python
【Leetcode刷题Python】297. 二叉树的序列化与反序列化
LeetCode第297题"二叉树的序列化与反序列化"的Python语言解决方案,包括序列化二叉树为字符串和反序列化字符串为二叉树的算法实现。
28 5
|
5月前
|
算法 JavaScript
JS 【详解】二叉树(含二叉树的前、中、后序遍历技巧和算法实现)
JS 【详解】二叉树(含二叉树的前、中、后序遍历技巧和算法实现)
53 0
|
7月前
|
JavaScript 前端开发
剑指 Offer 31. 栈的压入、弹出序列 (javascript实现)
剑指 Offer 31. 栈的压入、弹出序列 (javascript实现)
|
7月前
|
Java Go 算法
Golang每日一练(leetDay0100) 二叉树序列化和反序列化
Golang每日一练(leetDay0100) 二叉树序列化和反序列化
58 0
Golang每日一练(leetDay0100) 二叉树序列化和反序列化
|
7月前
|
Go Python 算法
Python每日一练(20230412) 队列实现栈、二叉树序列化、交换链表节点
Python每日一练(20230412) 队列实现栈、二叉树序列化、交换链表节点
771 0
Python每日一练(20230412) 队列实现栈、二叉树序列化、交换链表节点
|
7月前
|
算法 前端开发
331. 验证二叉树的前序序列化
331. 验证二叉树的前序序列化
50 0
|
7月前
|
存储 算法 JavaScript
JS算法-二叉树的后序遍历
JS算法-二叉树的后序遍历
|
7月前
|
算法 JavaScript
JS算法-二叉树的右视图
JS算法-二叉树的右视图