Serialize and Deserialize BST
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.
Solution: Preorder Traversal
Serialize and deserialize binary tree and binary serach tree is basically the same. We will use preorder traversal to encode and decode the tree.
class Codec {
public:
// Encodes a tree to a single string.
string serialize(TreeNode* root) {
ostringstream s;
serializeUtil(root, s);
return s.str();
}
// Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
istringstream s(data);
return deserializeUtil(s);
}
private:
void serializeUtil(TreeNode* root, ostringstream &s) {
if (!root) {
s << ". ";
} else {
s << root->val << " ";
serializeUtil(root->left, s);
serializeUtil(root->right, s);
}
}
TreeNode* deserializeUtil(istringstream &s) {
string str = "";
if (!(s >> str) || str == ".") return NULL;
TreeNode *root = new TreeNode(stoi(str));
root->left = deserializeUtil(s);
root->right = deserializeUtil(s);
return root;
}
};