算法:序列化二叉树

分手后的思念是犯贱 2024-04-06 14:04 175阅读 0赞

606888b6d3f29753ba138d28f2825f7f.jpeg

请实现两个函数,分别用来序列化和反序列化二叉树。

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

示例

e373e5d59db9d1f2215c1a969963f11a.jpeg

  • 输入:root = [1,2,3,null,null,4,5]
  • 输出:[1,2,3,null,null,4,5]

方法:层序遍历BFS

序列化:15b02e5ed5bf42c9b1a27a2fc905732d.png

借助队列,对二叉树进行层序遍历,而且为了表示二叉树的完整性,我们也会把 null 节点也记录下来。

代码如下:

d2734cc94fa58e6fe1e775387e243dac.jpeg

复杂度分析

  • 时间复杂度:O(N),N 为二叉树的节点数。
  • 空间复杂度:O(N) 。

反序列化:

序列化后的字符串为“[1,2,3,null,null,4,5,null,null,null,null]”,归纳整理为下表:


























































node.val

node的索引

left的索引

right的索引

1

0

1

2

2

1

3

4

3

2

5

6

4

5

7

8

5

6

9

10

……

……

……

……

≠ null

n

2(n - m) + 1

2(n - m) + 2

= null

n

基于我们分析的规律,利用队列按层构建二叉树,在这里我们需要一个指针来指向节点的左/右子节点,每构建一个节点的左/右子节点,指针就向右移动 1 位。

代码如下:

20d2f21bc337246af2cbcbec3c5ad6f2.jpeg

复杂度分析

  • 时间复杂度:O(N) ,N 为二叉树的节点数。
  • 空间复杂度: O(N) 。

END

勤奋是成功之母,懒惰乃万恶之源,赠友人。

好兄弟可以点赞并关注我的公众号“javaAnswer”,全部都是干货。

4fc10a8d54134e87898afad9c970d4f2.png

发表评论

表情:
评论列表 (有 0 条评论,175人围观)

还没有评论,来说两句吧...

相关阅读

    相关 序列

    请实现两个函数,分别用来序列化和反序列化二叉树 二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列

    相关 序列

    题目描述 请实现两个函数,分别用来序列化和反序列化二叉树。 根据树的前序遍历序列和中序遍历序列可以唯一的构造出一棵二叉树。受此启发,我们可以先把一棵二叉树序列化成一个前

    相关 序列/反序列

    二叉树被记录成文件的过程,为二叉树的序列化 通过文件重新建立原来的二叉树的过程,为二叉树的反序列化 设计方案并实现。 (已知结点类型为32位整型) 思路:先序遍历实现。