Design an algorithm and write code to serialize and deserialize a binary tree. Writing the tree to a file is called ‘serialization’ and reading back from the file to reconstruct the exact same binary tree is ‘deserialization’.
There is no limit of how you deserialize or serialize a binary tree, you only need to make sure you can serialize a binary tree to a string and deserialize this string to the original structure.
/**
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode *left, *right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
public:
/**
* This method will be invoked first, you should design your own algorithm
* to serialize a binary tree which denote by a root node to a string which
* can be easily deserialized by your own "deserialize" method later.
*/
void serializeHelper(TreeNode *node,string& res){
if(node){
res+=to_string(node->val)+" ";
}else{
res+="# ";
return;
}
serializeHelper(node->left,res);
/*
if(node->left){
serializeHelper(node->left,res);
}else{
res+="# ";
}*/
serializeHelper(node->right,res);
/*
if(node->right){
serializeHelper(node->right,res);
}else{
res+="# ";
}*/
}
string serialize(TreeNode *root) {
// write your code here
string res="";
serializeHelper(root,res);
return res;
}
/**
* This method will be invoked second, the argument data is what exactly
* you serialized at method "serialize", that means the data is not given by
* system, it's given by your own serialize method. So the format of data is
* designed by yourself, and deserialize it here as you serialize it in
* "serialize" method.
*/
TreeNode* deserializeHelper(istringstream& ss){
string str;
ss>>str;
if(str[0]=='#'){
return NULL;
}
int value=atoi(str.c_str());
TreeNode *node=new TreeNode(value);
node->left=deserializeHelper(ss);
node->right=deserializeHelper(ss);
return node;
}
TreeNode *deserialize(string data) {
// write your code here
istringstream ss(data);
TreeNode *root=deserializeHelper(ss);
return root;
}
};