题目描述
请实现两个函数,分别用来序列化和反序列化二叉树。
你需要设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。
题目解析
给一个二叉树,输出它的字符串序列,再根据这个字符串序列还原成二叉树
递归
/*
首先说明这个代码在leetcode上最后几个样例过不去,提示超出内存限制
,但是在acwing上可以跑通
*/
class Codec {
public:
string res;
int index= 0;
// Encodes a tree to a single string.
string serialize(TreeNode* root) {
if(root == nullptr)
{
res.append("null ");
}
else
{
res.append(to_string(root->val));
res.append(" ");
serialize(root->left);
serialize(root->right);
}
return res;
}
// Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
//cout<<data;
if(index > data.size() || data[index]=='n')
{
index+=5;
return nullptr;
}
bool f=false;
if(data[index]=='-')
{
index++;
f=true;
}
int val=data[index++]-'0';
while(data[index]!=' ')
{
val*=10;
val+=data[index]-'0';
index++;
}
if(f)
{
val*=-1;
}
index++;
TreeNode* root=new TreeNode(val);
root->left = deserialize(data);
root->right = deserialize(data);
return root;
}
};
非递归
class Codec {
public:
// Encodes a tree to a single string.
string serialize(TreeNode* root) {
queue<TreeNode*> q;
string res;
q.push(root);
while(!q.empty())
{
TreeNode* t = q.front();
q.pop();
if(t==nullptr)
{
res.append("null ");
}
else
{
res.append(to_string(t->val));
res.append(" ");
q.push(t->left);
q.push(t->right);
}
}
return res;
}
// Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
int i=0;
if(data[i]=='n')
{
return nullptr;
}
queue<TreeNode*> q;
TreeNode* root =get(data,i);
q.push(root);
while(!q.empty())
{
TreeNode* t=q.front();
q.pop();
TreeNode* l=get(data,i);
TreeNode* r=get(data,i);
t->left = l;
t->right = r;
if(l!= nullptr)
{
q.push(l);
}
if(r!=nullptr)
{
q.push(r);
}
}
return root;
}
TreeNode* get(string data, int& i)
{
if(i>=data.size())
{
return nullptr;
}
if(data[i]=='n')
{
i+=5;
return nullptr;
}
bool f=false;
if(data[i]=='-')
{
f = true;
i++;
}
int val = data[i++] - '0';
while(data[i] !=' ')
{
val*=10;
val+=data[i]-'0';
i++;
}
if(f)
{
val*=-1;
}
i++;
TreeNode * r = new TreeNode(val);
return r;
}
};