设计一个算法,并编写代码来序列化和反序列化二叉树。将树写入一个文件被称为“序列化”,读取文件后重建同样的二叉树被称为“反序列化”。
如何反序列化或序列化二叉树是没有限制的,你只需要确保可以将二叉树序列化为一个字符串,并且可以将字符串反序列化为原来的树结构。
样例
给出一个测试数据样例, 二叉树{3,9,20,#,#,15,7}
,表示如下的树结构:
3
/ \
9 20
/ \
15 7
我们的数据是进行BFS遍历得到的。当你测试结果wrong answer时,你可以作为输入调试你的代码。
你可以采用其他的方法进行序列化和反序列化。
/**
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode *left, *right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
public:
/**
* This method will be invoked first, you should design your own algorithm
* to serialize a binary tree which denote by a root node to a string which
* can be easily deserialized by your own "deserialize" method later.
*/
string serialize(TreeNode *root) {
// write your code here
string temp;
if (root == NULL)
{
return temp;
}
char str[10];
queue<TreeNode*> buf;
buf.push(root);
while (!buf.empty())
{
TreeNode *front = buf.front();
if (front != NULL)
{
sprintf(str, "%d", front->val);
temp += str;
buf.push(front->left);
buf.push(front->right);
}
else
{
temp += "#";
}
temp += " ";
buf.pop();
}
int end = temp.length()-1;
while (temp[end] == '#' || temp[end] == ' ')
{
end--;
}
return temp.substr(0, end+1);
}
/**
* This method will be invoked second, the argument data is what exactly
* you serialized at method "serialize", that means the data is not given by
* system, it's given by your own serialize method. So the format of data is
* designed by yourself, and deserialize it here as you serialize it in
* "serialize" method.
*/
TreeNode *deserialize(string data) {
// write your code here
int n = data.length();
if (n < 1)
{
return NULL;
}
vector<int> pos;
pos.push_back(-1);
for (int i = 0; i < n; i++)
{
if (data[i] == ' ')
{
pos.push_back(i);
}
}
if (pos.size() == 1)
{
return new TreeNode(atoi(data.c_str()));
}
pos.push_back(n);
vector<TreeNode*> nodes;
for (int i = 0; i < pos.size()-1; i++)
{
string temp = data.substr(pos[i]+1, pos[i+1]-pos[i]-1);
if (temp == "#")
{
nodes.push_back(NULL);
}
else
{
TreeNode *p = new TreeNode(atoi(temp.c_str()));
nodes.push_back(p);
}
}
int m = nodes.size();
int p = 1;
int q = 0;
while (p < m)
{
if (nodes[q] == NULL)
{
q++;
}
else
{
nodes[q]->left = nodes[p];
nodes[q]->right = nodes[p+1];
p += 2;
q++;
}
}
return nodes[0];
}
};