Serialization And Deserialization
297. Serialize and Deserialize Binary Tree (Hard)
The following code can serialize and deserialize a binary tree in the same way as LeetCode.
// OJ: https://leetcode.com/problems/serialize-and-deserialize-binary-tree/
// Author: github.com/lzl124631x
vector<string> stringToVector(string str) {
str = str.substr(1, str.size() - 2);
istringstream ss(str);
string token;
vector<string> ans;
while (getline(ss, token, ',')) ans.push_back(token);
return ans;
}
string vectorToString(vector<string> v){
auto i = v.begin();
ostringstream ans;
ans << "[";
for(; i != v.end(); ++i) {
ans << *i;
if (i + 1 != v.end()) ans << ",";
}
ans << "]";
return ans.str();
}
class Codec {
private:
string nilToken = "null";
public:
TreeNode* deserialize(string str) {
auto v = stringToVector(str);
if (v.empty()) return NULL;
queue<TreeNode*> q;
auto root = new TreeNode(stoi(v[0]));
q.push(root);
for (int i = 1, N = v.size(); i < N;) {
auto node = q.front();
q.pop();
if (v[i] != nilToken) q.push(node->left = new TreeNode(stoi(v[i])));
++i;
if (i < N && v[i] != nilToken) q.push(node->right = new TreeNode(stoi(v[i])));
++i;
}
return root;
}
string serialize(TreeNode* root) {
vector<string> v;
if (!root) return vectorToString(v);
queue<TreeNode*> q;
q.push(root);
while (q.size()) {
root = q.front();
q.pop();
if (root) {
v.push_back(to_string(root->val));
q.push(root->left);
q.push(root->right);
} else v.push_back(nilToken);
}
while (v.back() == nilToken) v.pop_back();
return vectorToString(v);
}
};
See more my solutions here
Last updated