分析:首先审题emmm
好像看懂了,又好像没看懂......
然后去看官方题解去,emmm,好家伙,原来还能随便序列化,只要自己的序列化和反序列化可以相互转化就好了,淦,原来是没审题审仔细......
其实题目呢是这个意思,就是让我们把树转化为一个字符串序列,这叫做序列化,然后根据一个字符串可以构造出一颗二叉树,这叫反序列化,emmm,至于中间形式,好像也没有什么严格要求,序列化的方式好像可以层序,前序(大部分题解),emmm,不知道这题为什么是困难,可能是题目中给的信息,有点不全?造成理解困难?
以下是基本cv的官方题解代码(前序实现的):
class Codec {
public:
// Encodes a tree to a single string.
void serializeCore(TreeNode* root,string &s)
{
if(root==NULL)
{
s+="None,";
return;
}
s+=to_string(root->val)+",";
serializeCore(root->left,s);
serializeCore(root->right,s);
}
string serialize(TreeNode* root)
{
string s;
serializeCore(root,s);
return s;
}
// Decodes your encoded data to tree.
TreeNode* deserializeCore(list<string>& dataArray)
{
if(dataArray.front()=="None")
{
dataArray.erase(dataArray.begin());
return NULL;
}
TreeNode* node=new TreeNode(stoi(dataArray.front()));
dataArray.erase(dataArray.begin());//注意要删除队列首元素
node->left=deserializeCore(dataArray);
node->right=deserializeCore(dataArray);
return node;
}
TreeNode* deserialize(string data)
{
list<string> dataArray;
string str;
for(auto &ch:data)
{
if(ch==',')
{
dataArray.push_back(str);
str.clear();
}
else
{
str+=ch;
}
}
return deserializeCore(dataArray);
}
};