//非递归
class Codec {
public:
// Encodes a tree to a single string.
string serialize(TreeNode* root) {
string val;
if(root)
{
val+=getstring(root->val)+"!";
serialize(root->left);
serialize(root->right);
}
else
val+="#!";
return val;
}
// Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
vector<string> values;
string temp;
for(int i=0;i<data.size();i++){
if(data[i]!='!') temp+=data[i];
else{
values.push_back(temp);
}
}
TreeNode* root = new TreeNode(stoi(values[0]));
for(int i=1;i<values.size();i++){
root->left=buildtree(values[i]);
root->right=buildtree(values[i]);
}
return root;
}
//整数转字符串
string getstring(int x)
{
string str;
while(x)
{
str+='0'+x%10;
x=x/10;
}
reverse(str.begin(),str.end());
return str;
}
TreeNode* buildtree(string val) {
if (val == "#")
return nullptr;
TreeNode* root = new TreeNode(stoi(val));
///return root;
}
};*/
// Recursion
//递归版
class Codec {
public:
// Encodes a tree to a single string.
string serialize(TreeNode* root) {
ostringstream out;
serialize(root, out);
return out.str();
}
// Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
istringstream in(data);
return deserialize(in);
}
private:
void serialize(TreeNode *root, ostringstream &out) {
if (root) {
out << root->val << ' ';
serialize(root->left, out);
serialize(root->right, out);
} else {
out << "# ";
}
}
TreeNode* deserialize(istringstream &in) {
string val;
in >> val;
if (val == "#") return nullptr;
TreeNode *root = new TreeNode(stoi(val));
root->left = deserialize(in);
root->right = deserialize(in);
return root;
}
};