LC 297 - Serialize and Deserialize Binary Tree
Question
Serialization is the process of converting a data structure or object into a sequence of bits so that it can be stored in a file or memory buffer, or transmitted across a network connection link to be reconstructed later in the same or another computer environment.
Design an algorithm to serialize and deserialize a binary tree. There is no restriction on how your serialization/deserialization algorithm should work. You just need to ensure that a binary tree can be serialized to a string and this string can be deserialized to the original tree structure.
Clarification: The input/output format is the same as how LeetCode serializes a binary tree. You do not necessarily need to follow this format, so please be creative and come up with different approaches yourself.
Example 1:
1
2
Input: root = [1,2,3,null,null,4,5]
Output: [1,2,3,null,null,4,5]
Example 2:
1
2
Input: root = []
Output: []
Constraints:
- The number of nodes in the tree is in the range
[0, 104]. -1000 <= Node.val <= 1000
Links
Question here and solution here
Solution
concept
Normally we will need both inorder and preorder/postorder traversal to fully define a tree, but here we can label empty nodes as Null and this turns the tree into a Full Binary Tree and we can reconstruct the tree with just preorder traversal.
The idea is just run DFS and if we seen a null node (i.e. the current node has no child node and we still DFS down), we will append a Null in the path. We will reconstruct the tree with preorder traversal.
code
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
56
# 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
"""
output = []
def dfs(node):
if not node:
output.append("Null")
return
output.append(str(node.val))
dfs(node.left)
dfs(node.right)
dfs(root)
return ",".join(output)
def deserialize(self, data):
"""Decodes your encoded data to tree.
:type data: str
:rtype: TreeNode
"""
self.idx = 0
data = data.split(",")
def dfs():
if data[self.idx] == "Null":
self.idx += 1
return None
node = TreeNode(int(data[self.idx]))
self.idx += 1
node.left = dfs()
node.right = dfs()
return node
root = dfs()
return root
# Your Codec object will be instantiated and called as such:
# ser = Codec()
# deser = Codec()
# ans = deser.deserialize(ser.serialize(root))
Complexity
time: $O(n)$
space: $O(n)$
