https://leetcode.com/problems/serialize-and-deserialize-bst/#/description
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 search tree. There is no restriction on how your serialization/deserialization algorithm should work. You just need to ensure that a binary search tree can be serialized to a string and this string can be deserialized to the original tree structure.
The encoded string should be as compact as possible.
Note: Do not use class member/global/static variables to store states. Your serialize and deserialize algorithms should be stateless.
Sol:
Serialize:
Use preorder to keep the BST data structure and store data in a list as strings.
Deserialize:
Pop elements from the serialization list and biuld new nodes in a preorder manner.
# Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Codec: # Time O(n) def serialize(self, root): """Encodes a tree to a single string. :type root: TreeNode :rtype: str """ vals = [] def preOrder(node): if node: vals.append(node.val) preOrder(node.left) preOrder(node.right) preOrder(root) return ' '.join(map(str, vals)) def deserialize(self, data): """Decodes your encoded data to tree. :type data: str :rtype: TreeNode """ vals = collections.deque(int(val) for val in data.split()) def build(minVal, maxVal): if vals and minVal < vals[0] < maxVal: val = vals.popleft() node = TreeNode(val) node.left = build(minVal, val) node.right = build(val, maxVal) return node return build(float('-INF'), float('INF')) # Your Codec object will be instantiated and called as such: # codec = Codec() # codec.deserialize(codec.serialize(root))