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));