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.
For example, you may serialize the following tree
1 / \ 2 3 / \ 4 5as
"[1,2,3,null,null,4,5]"
, just the same as
how LeetCode OJ serializes a binary tree. You do not necessarily need to follow this format, so please be creative and come up with different approaches yourself.
Note: Do not use class member/global/static variables to store states. Your serialize and deserialize algorithms should be stateless.
Credits:
Special thanks to @Louis1992 for adding this problem and creating all test cases.
Subscribe to see which companies asked this question
分析:
注意
1,题目并没有要求遍历方法,所以可以自己挑选。
2,题目没有要求如何定义空节点,所以可以自己定义。
3.atoi(const char * t)与stoi(string t)的区别,最好还是用stoi,可以避免负数等情况,我写的时候没有注意这个点,跑了好久的runningtime.
4,istream与ostream有很大的益处,比如对于空格的自动处理等,需要注意。
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Codec {
public:
// Encodes a tree to a single string.
string serialize(TreeNode* root) {
if(root==NULL) return "";
ostringstream o1;
return pretravel(o1,root);
}
// Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
// cout<<data<<endl;
if(data.size()==0) return NULL;
istringstream in(data);
return build(in);
}
private:
string pretravel(ostringstream &out,TreeNode* root)
{
if(root)
{
out<<to_string(root->val)+" ";
pretravel(out,root->left);
pretravel(out,root->right);
}
else
out<<"#"<<" ";
return out.str();
}
TreeNode* build(istringstream& in)
{
string s1;
in>>s1;
if(s1=="#") return NULL;
TreeNode * root=new TreeNode(stoi(s1));
// cout<<s1<<" "<<root->val<<endl;
root->left=build(in);
root->right=build(in);
return root;
}
};
// Your Codec object will be instantiated and called as such:
// Codec codec;
// codec.deserialize(codec.serialize(root));