/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
*/
class Solution {
private:
    char sep = ',';
    char null_node = '#';
public:
    char* Serialize(TreeNode *root) {    
        if(root == nullptr){
            return nullptr;
        }
        
        queue<TreeNode*> Q;
        Q.push(root);
        string res = "";
        while(!Q.empty()){
            auto node = Q.front();
            Q.pop();
            if(node){
                res += to_string(node->val);
                Q.push(node->left);
                Q.push(node->right);
            }
            else{
                res.push_back(null_node);
            }
            res.push_back(sep);
        }
        char* a = new char[res.length()+1];
        strcpy(a, res.c_str());
        return a;
    }
    
    TreeNode* Deserialize(char *str) {
        if(str == nullptr){
            return nullptr;
        }
        
        string res(str);
        if(res[0] == null_node){
            return nullptr;
        }
        
        vector<string> nodes = split_string(res, ",");
        
        queue<TreeNode*> Q;
        TreeNode* root = new TreeNode(stoi(nodes[0]));
        Q.push(root);
        
        for(int i=1; i<nodes.size();){
            auto parent = Q.front();
            Q.pop();
            string left = nodes[i++];
            if(left != "#"){
                parent->left = new TreeNode(stoi(left));
                Q.push(parent->left);
            }
            else{
                parent->left = nullptr;
            }
            
            string right = nodes[i++];
            if(right != "#"){
                parent->right = new TreeNode(stoi(right));
                Q.push(parent->right);
            }
            else{
                parent->right = nullptr;
            }
        }
        
        return root;
    }
    
    vector<string> split_string(string s, string pattern) {
        vector<string> res;
        // s += pattern;
        int pos;
        for (int i = 0; i < s.length(); i++) {
            pos = s.find(pattern, i);
            if (pos < s.length()) {
                string temp = s.substr(i, pos - i);
                res.push_back(temp);
                i = pos + pattern.length() - 1;
            }
        }
        return res;
    }
};