297 二叉树的序列化与反序列化

本文最后更新于:2020年12月25日 下午

序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。

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

示例:

1
2
3
4
5
6
7
8
9
你可以将以下二叉树:

1
/ \
2 3
/ \
4 5

序列化为 "[1,2,3,null,null,4,5]"

提示: 这与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。

说明: 不要使用类的成员 / 全局 / 静态变量来存储状态,你的序列化和反序列化算法应该是无状态的。

Solution

参考:《算法小抄》3.5、@tinylife

  • 二叉树的遍历

  • 前序遍历

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# @lc code=start
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None

class Codec:

def serialize(self, root):
"""Encodes a tree to a single string.

:type root: TreeNode
:rtype: str
"""
if not root: return "[]"
res = []

def preOrder(root):
if not root:
res.append("null")
return
res.append(str(root.val))
preOrder(root.left)
preOrder(root.right)

preOrder(root)
return '['+','.join(res)+']'

def deserialize(self, data):
"""Decodes your encoded data to tree.

:type data: str
:rtype: TreeNode
"""
if data=='[]':
return
res = iter(data[1:-1].split(','))

def preOrder():
val = next(res)
if val =="null": return
node = TreeNode(int(val))
node.left = preOrder()
node.right = preOrder()
return node

return preOrder()

# Your Codec object will be instantiated and called as such:
# ser = Codec()
# deser = Codec()
# ans = deser.deserialize(ser.serialize(root))
# @lc code=end
  • 后序遍历
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Codec:

def serialize(self, root):
if not root: return "[]"
res = []

def postOrder(root):
if not root:
res.append("null")
return
postOrder(root.left)
postOrder(root.right)
res.append(str(root.val))

postOrder(root)
return '['+','.join(res)+']'

def deserialize(self, data):
if data=='[]':
return
res = data[1:-1].split(',')

def postOrder():
val = res.pop()
if val =="null": return
node = TreeNode(int(val))
node.right = postOrder()
node.left = postOrder()
return node

return postOrder()
  • 层序遍历
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
class Codec:

def serialize(self, root):
if not root: return "[]"
res = []
queue = deque()
queue.append(root)

while queue:
node = queue.popleft()
if node:
res.append(str(node.val))
queue.append(node.left)
queue.append(node.right)
else:
res.append("null")

return '['+','.join(res)+']'

def deserialize(self, data):
if data=='[]':
return
res = data[1:-1].split(',')
i = 1
root = TreeNode(int(res[0]))
queue = deque()
queue.append(root)
while queue:
node = queue.popleft()
left = res[i]
if left != "null":
node.left = TreeNode(int(left))
queue.append(node.left)
else:
node.left = None
i+=1
right = res[i]
if right != "null":
node.right = TreeNode(int(right))
queue.append(node.right)
else:
node.right = None
i+=1

return root

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!