题目描述
请实现两个函数,分别用来序列化和反序列化二叉树。
基本思想很简单,序列化就是用某一种遍历方法将二叉树元素存储在字符串数组中,当然要一个个元素分离,分得清谁是谁。反序列化就是把存储在字符串数组中的元素进行重构,使之成为二叉树。我们不妨选择前序遍历的思想进行搜索与重构。本题的关键是如何对元素进行存储,可以放在char**或者vector<string>或者字符串流o/istringstream中(为什么不放在char*或者string中,其实也可以,只不过要添加分割符让元素之间分离),我们选择字符串流,这个做起来比较简单。代码如下:
class Solution {
public:
char* Serialize(TreeNode *root) {
ostringstream out;
Serialize(root,out);
string str=out.str();
char* re=new char[str.size()+1];
strcpy(re,str.c_str());
return re;
}
TreeNode* Deserialize(char *str) {
string s=str;
istringstream in(s);
return Deserialize(in);
}
void Serialize(TreeNode *root,ostringstream& out)
{
if(root==NULL){
out<<"# ";
}else{
out<<root->val<<' ';
Serialize(root->left,out);
Serialize(root->right,out);
}
}
TreeNode* Deserialize(istringstream& in)
{
string val;
in>>val;
if(val=="#"){
return NULL;
}
TreeNode* root=new TreeNode(stoi(val));
root->left=Deserialize(in);
root->right=Deserialize(in);
return root;
}
};