设计一个算法,并编写代码来序列化和反序列化二叉树。将树写入一个文件被称为“序列化”,读取文件后重建同样的二叉树被称为“反序列化”。
如何反序列化或序列化二叉树是没有限制的,你只需要确保可以将二叉树序列化为一个字符串,并且可以将字符串反序列化为原来的树结构。
样例
样例 1:
输入:{3,9,20,#,#,15,7}
输出:{3,9,20,#,#,15,7}
解释:
二叉树 {3,9,20,#,#,15,7},表示如下的树结构:
3
/ \
9 20
/ \
15 7
它将被序列化为 {3,9,20,#,#,15,7}
样例 2:
输入:{1,2,3}
输出:{1,2,3}
解释:
二叉树 {1,2,3},表示如下的树结构:
1
/ \
2 3
它将被序列化为 {1,2,3}
我们的数据是进行 BFS 遍历得到的。当你测试结果 Wrong Answer 时,你可以作为输入调试你的代码。
你可以采用其他的方法进行序列化和反序列化。
注意事项
对二进制树进行反序列化或序列化的方式没有限制,LintCode 将您的 serialize 输出作为 deserialize 的输入,它不会检查序列化的结果。
思路:
序列化:用#来代替NULL,把节点值转为string存放。‘ ’空格符来表示节点值的间隔,先序遍历得到字符串。
反序列化:利用队列,把#结点存为INT_MAX,其他值由string转为int。接着,先序建立二叉树即可
/**
* 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.
*/
void serializeCore(TreeNode* root, string &s){
if(root == NULL){
s += "# ";
return;
}
s += to_string(root->val) + " ";
serializeCore(root->left, s);
serializeCore(root->right, s);
}
string serialize(TreeNode * root) {
// write your code here
string s = "";
serializeCore(root, s);
// s.pop_back();
return s;
}
/**
* 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
queue<int> q;
string tmp="";
for (auto w : data) {
if(w==' ')
{
if(tmp=="#") q.push(INT_MAX);
else q.push(stoi(tmp));
tmp="";
}
else tmp.push_back(w);
}
TreeNode*root=build(q);
return root;
}
TreeNode*build(queue<int> &q)
{
if(q.front()==INT_MAX)
{
q.pop();
return NULL;
}
TreeNode*root=new TreeNode(q.front());
q.pop();
root->left=build(q);
root->right=build(q);
return root;
}
};