实用算法题: 二叉树序列化与反序列化
⛳ 实用算法题系列第二篇 - 二叉树序列化与反序列化。
🐼 先看原题
🦄 思路
虽然标签上是困难题,但实际上可以拆解成两个中等题,二叉树前序遍历 + 前序遍历二叉树
。借鉴labuladong
对二叉树遍历的总结:
1 | const traverse = (root) => { |
💡 一般说的前中后序遍历,都是针对根节点而言。即前序遍历 -> 根左右,中序遍历 -> 左根右,后序遍历 -> 左右根。
因此,算法题的序列化代码如下:
1 | var serialize = function (root) { |
通过序列化我们可以得到一串字符串,代表二叉树前序遍历结果。接下来,我们需要对其进行反序列化,重新生成二叉树。一般来讲,我们只有前序遍历结果无法还原二叉树,原因是不能确定空节点位置,而本题可以生成,因为我们将空节点用#
表示。
按照前序遍历特性,字符串的首字符就是根节点,反序列化代码:
1 | var deserialize = function (data) { |
🎈 算法使用场景:JSON
JSON
是一种跨语言工具,在JS
中我们可以使用JSON.stringfy(), JSON.parse()
实现对值的序列化和反序列化。
💡 结尾
😂 字节跳动的面试官曾问过,如何将JavaScript
语言的代码转成Java / C++
,JSON
不是面试官期望的答案。我想JSON
只是一种序列化和反序列化的一种实现方式,可能面试官期望的是实现原理,有时间我会专门写一篇博客分析JSON
的原理。