Problem:Design an algorithm and write code to serialize and deserialize a binary tree. Writing the tree to a file is called 'serialization' and reading back from the file to reconstruct the exact same binary tree is 'deserialization'.
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) {
queue<TreeNode*> node;
vector<string> result;
TreeNode* tmp;
node.push(root);
while (!node.empty()) {
tmp = node.front();
node.pop();
if (tmp)
result.push_back(to_string(tmp->val));
else {
result.push_back("#");
continue;
}
if (tmp->left)
node.push(tmp->left);
else
node.push(nullptr);
if (tmp->right)
node.push(tmp->right);
else
node.push(nullptr);
}
string r;
for (int i = 0;i<result.size();i++) {
r += result[i] + " ";
}
return r;
}
/**
* 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) {
istringstream iss(data);
vector<TreeNode*> tree;
TreeNode* tmp;
string str;
getline(iss, str, ' ');
while (!str.empty()) {
if (str != "#")
tmp = new TreeNode(stoi(str));
else
tmp = nullptr;
tree.push_back(tmp);
getline(iss, str, ' ');
}
TreeNode* head=tree[0];
int parent = 0;
int child = 1;
while (child<tree.size()) {
tmp = tree[parent];
if (!tmp) {
parent++;
continue;
}
tmp->left = tree[child];
tmp->right = tree[child+1];
child += 2;
parent++;
}
return head;
}
};