请实现两个函数,分别用来序列化和反序列化二叉树。
示例:
你可以将以下二叉树:
1
/ \
2 3
/ \
4 5
序列化为 “[1,2,3,null,null,4,5]”
注意点:
string类尽量不用 + 过于耗内存 改为用s.append(xxxx) 或者 s.push_back()
to_string() 来处理数字转字符串
atoi()处理字符串转数字
思路:
层次遍历,具体细节可以用不同的想法实现
主要还是利用已经编好的函数来减轻代码量
/**
* 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) {
string s;
queue<TreeNode*>q;
q.push(root);
while(!q.empty())
{
TreeNode* to=q.front();
q.pop();
if(to!=NULL)
{
s.append(to_string(to->val));
q.push(to->left);
q.push(to->right);
}
else
{
s.push_back('$');
}
s.push_back(',');
}
return s;
}
int len;
int i;
TreeNode* getdata(string& data,int p)
{
string str = "";
while(p<len&&data[p]!=',')
{
str.push_back(data[p]);
p++;
}
i=p+1;
if(str=="$")
{
return NULL;
}
else
{
return new TreeNode(std::stoi(str));
}
}
TreeNode* deserialize(string data) {
if(data[0]=='$') return NULL;
i=0;
TreeNode* root=getdata(data,i);
queue<TreeNode*>q;
q.push(root);
while(!q.empty())
{
TreeNode* to=q.front();
q.pop();
to->left=getdata(data,i);
to->right=getdata(data,i);
if(to->left!=NULL)
{
q.push(to->left);
}
if(to->right!=NULL)
{
q.push(to->right);
}
}
return root;
}
};
// Your Codec object will be instantiated and called as such:
// Codec codec;
// codec.deserialize(codec.serialize(root));