/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
*/
class Solution {
public:
    string bestr(TreeNode *root){
        if(root==nullptr){
            return "#,";
        }
        string str=",";
        if(root->val==0){
            str="0,";
        }
        int t=root->val;
        while(t!=0){
            string str0=" ";
            str0[0]=t%10+48;
            str=str0+str;
            t/=10;
        }
        str+=bestr(root->left);
        str+=bestr(root->right);
        return str;
    }
    TreeNode* betree(string &str){
        if(str.size()==0){
            return nullptr;
        }
        if(str[0]=='#'){
            str.erase(0,2);
            return nullptr;
        }
        int va=0;
        while(str[0]!=','){
            va*=10;
            va+=(str[0]-48);
            str.erase(0,1);
        }
        str.erase(0,1);
        TreeNode *ans=new TreeNode(va);
        ans->left=betree(str);
        ans->right=betree(str);
        return ans;
    }
    char* Serialize(TreeNode *root) {
        string str;
        str=bestr(root);
        char *ch=new char[str.size()+1];
        strcpy(ch,str.c_str());
        ch[str.size()]='\0';
        return ch;
    }
    TreeNode* Deserialize(char *str) {
        string str0;
        for(int i=0;*(str+i)!='\0';i++){
            str0+=*(str+i);
        }
        return betree(str0);
    }
};