剑指 Offer 37. 序列化二叉树

1. 题目

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

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

2. 示例

 

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

3. 题解

  • 序列化(二叉树转字符串数组)
    • 其实这是一个层次遍历,我们只需要层次遍历二叉树,将其值存入数组列表即可。
  • 反序列化(字符串数组转二叉树)
    • 这个是序列化的反转
    • 数组的第一个元素作为根节点
    • 然后创建一个队列,并将根节点放入队列
    • 遍历队列,取对头元素,反复为其创建左右子树,其赋值顺序刚好与字符数组书序一直,用i来控制顺序即可。

4. 实现

 1 class Codec:
 2     
 3     def serialize(self, root):
 4         """Encodes a tree to a single string.
 5 
 6         :type root: TreeNode
 7         :rtype: str
 8         """
 9         if not root: return "[]"
10         res = []
11         # 创建队列,并将root放入队列
12         queue = collections.deque()
13         queue.append(root)
14 
15         # 当前元素放入列表,当前元素的左子树和右子树入队列
16         while queue:
17             node = queue.popleft()
18             if node:
19                 res.append(str(node.val))
20                 queue.append(node.left)
21                 queue.append(node.right)
22             else:
23                 res.append("null")
24         return '[' + ','.join(res) + ']'
25 
26     def deserialize(self, data):
27         """Decodes your encoded data to tree.
28 
29         :type data: str
30         :rtype: TreeNode
31         """
32         if data == "[]":
33             return
34         # 获取元素
35         vals, i = data[1: -1].split(','), 1
36         # 常见根节点
37         root = TreeNode(int(vals[0]))
38         # 创建队列,用来存储所有节点
39         queue = collections.deque()
40         queue.append(root)
41         # 层次遍历所有节点
42         while queue:
43             # 获取最左边的节点,然后给给其赋值左右节点
44             node = queue.popleft()
45             # 赋值左子节点
46             if vals[i] != "null":
47                 node.left = TreeNode(int(vals[i]))
48                 queue.append(node.left)
49             # 左子节点创建后,节点值列表后移一位
50             i += 1
51             # 赋值右子节点
52             if vals[i] != "null":
53                 node.right = TreeNode(int(vals[i]))
54                 queue.append(node.right)
55             # 右子节点创建后,节点值列表后移一位
56             i += 1
57         return root

5. 结语

  努力去爱周围的每一个人,付出,不一定有收获,但是不付出就一定没有收获! 给街头卖艺的人零钱,不和深夜还在摆摊的小贩讨价还价。愿我的博客对你有所帮助(*^▽^*)(*^▽^*)!

  如果客官喜欢小生的园子,记得关注小生哟,小生会持续更新(#^.^#)(#^.^#)。

 

 

 

 

 

 

 

posted @ 2021-07-22 22:17  抚琴尘世客  阅读(44)  评论(0编辑  收藏  举报