剑指 Offer 37. 序列化二叉树

139 阅读2分钟

1、树序列化和反序列化是什么意思???

我们先来看下什么是序列化,以下定义来自维基百科:

❝ 序列化(serialization)在计算机科学的数据处理中,是指将数据结构或对象状态转换成可取用格式(例如存成文件,存于缓冲,或经由网络中发送),以留待后续在相同或另一台计算机环境中,能恢复原先状态的过程。依照序列化格式重新获取字节的结果时,可以利用它来产生与原始对象相同语义的副本。对于许多对象,像是使用大量引用的复杂对象,这种序列化重建的过程并不容易。面向对象中的对象序列化,并不概括之前原始对象所关系的函数。这种过程也称为对象编组(marshalling)。从一系列字节提取数据结构的反向操作,是反序列化(也称为解编组、deserialization、unmarshalling)。

可见,序列化和反序列化在计算机科学中的应用还是非常广泛的。就拿 LeetCode 平台来说,其允许用户输入形如:

[1,2,3,null,null,4,5]

这样的数据结构来描述一颗树:

image.png

其实序列化和反序列化只是一个概念,不是一种具体的算法,而是很多的算法。并且针对不同的数据结构,算法也会不一样。本文主要讲述的是二叉树的序列化和反序列化。看完本文之后,你就可以放心大胆地去 AC 以下两道题:

2、开始做题啦

剑指 Offer 37. 序列化二叉树

咱们这里使用 中序遍历,queue.push()有可能推入的是null,所以在循环体内作出判断,如果node为null,则直接给res推入一个null

var serialize = function(root) {
    if (!root) return JSON.stringify([]);    
    let res = [];
    let queue = [root];
    while (queue.length) {
        let node = queue.shift();
        if (node !== null) {
            res.push(node.val);
            queue.push(node.left);
            queue.push(node.right);
        } else {
            res.push(null)
        }
    }
    return JSON.stringify(res);
};

var deserialize = function(data) {
    if (data === '[]') return null;
    let arr = JSON.parse(data);
    let root = new TreeNode(arr[0]);
    let queue = [root];
    let i = 1;
    while (queue.length){
        let node = queue.shift();
        if (arr[i] !== null) {
            node.left = new TreeNode(arr[i]);
            queue.push(node.left);
        }
        i++;
        if (arr[i] !== null) {
            node.right = new TreeNode(arr[i]);
            queue.push(node.right);
        }
        i++;
    }
    return root;
};

添加下面代码 开始调试代码

var obj = {
  val: 1,
  left: {
    val: 2,
    left: null,
    right: null
  },
  right: {
    val: 3,
    left: {
        val:4,
        left:null,
        right:null
    },
    right: {
        val:5,
        left:null,
        right:null
    }
  },
};
console.log(serialize(obj));
//输出数组为 '[1,2,3,null,null,4,5,null,null,null,null]'

添加下面代码