class Solution {
public:
    char* Serialize(TreeNode *root) {
        string s;
        queue<TreeNode*> q; 
        q.push(root);
        while(!q.empty()){
            TreeNode* tmp = q.front();
            q.pop();
            if(tmp){
                s += to_string(tmp->val);
                s += ",";// s.push_back(',');可以将char 复制转化为string
            }else{
                s += "#,";
                continue;
            }
            q.push(tmp->left);
            q.push(tmp->right);
        }
        char *ret = new char[s.length() + 1]; // 多一位存放‘\0’
        strcpy(ret, s.c_str());// c_str() string 转化为char 
        return ret;
    }

    TreeNode* Deserialize(char *str) {
        if(str == nullptr) {
            return nullptr;
        }

        string s(str);
        if(str[0] == '#'){
            return nullptr;
        }

        queue<TreeNode*> nodes;
        TreeNode *ret = new TreeNode(atoi(s.c_str())); // atoi()char* 转化为 int
        s = s.substr(s.find_first_of(',') + 1);
        nodes.push(ret);

        while(!nodes.empty() && !s.empty()){
            TreeNode *node = nodes.front();
            nodes.pop();
            if(s[0] == '#'){
                node->left = nullptr;
                s = s.substr(2);//从第二个位置得到子串 '#,'不要
            }
            else {
                node->left = new TreeNode(atoi(s.c_str()));
                nodes.push(node->left);
                s = s.substr(s.find_first_of(',') + 1);// 找到到第一个, find一样
            }
            if(s[0] == '#'){
                node->right = nullptr;
                s = s.substr(2);
            }
            else {
                node->right = new TreeNode(atoi(s.c_str()));
                nodes.push(node->right);
                s = s.substr(s.find_first_of(',') + 1);
            }
        }
        return ret;
    }
};