https://leetcode.com/problems/serialize-and-deserialize-binary-tree/
/**
* 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) {
if(root == NULL) return "";
vector<string> v;
queue<TreeNode*> q;
q.push(root);
while(!q.empty()){
TreeNode *t = q.front();
q.pop();
if(t == NULL) {
v.push_back("null");
continue;
}
v.push_back(to_string(t->val));
q.push(t->left);
q.push(t->right);
}
int l = v.size() - 1;
while(v[l] == "null") l--;
string res = v[0];
for(int i=1;i<=l;i++){
res += "," + v[i];
}
return res;
}
// Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
if(0 == data.length()) return NULL;
vector<string> v;
int start = 0;
for(int i=1;i<data.length();i++) {
if(data[i] != ',') continue;
v.push_back(data.substr(start, i-start));
start = i+1;
}
v.push_back(data.substr(start));
int index = 0;
TreeNode *node = new TreeNode(stoi(v[index]));
queue<TreeNode*> nodesOnLevel;
int count = v.size();
nodesOnLevel.push(node);
while(!nodesOnLevel.empty()) {
int size = nodesOnLevel.size();
for(int i=0;i<size;i++){
int left = index + 1;
if(left >= count) return node;
if(v[left] != "null") {
TreeNode *cur = new TreeNode(stoi(v[left]));
nodesOnLevel.front()->left = cur;
nodesOnLevel.push(cur);
}
int right = index + 2;
if(right >= count) return node;
if(v[right] != "null") {
TreeNode *cur = new TreeNode(stoi(v[right]));
nodesOnLevel.front()->right = cur;
nodesOnLevel.push(cur);
}
nodesOnLevel.pop();
index += 2;
}
}
return node;
}
};
// Your Codec object will be instantiated and called as such:
// Codec codec;
// codec.deserialize(codec.serialize(root));