/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
*/
class Solution {
public:
    void SerializeFuction(TreeNode* root,string& str){
        if(root==nullptr){
            str+="#";
            return;
        }
        str+=to_string(root->val);
        str+=' ';
        SerializeFuction(root->left,str);
        SerializeFuction(root->right,str);
    }

    char* Serialize(TreeNode *root) {    
        string s="";
        SerializeFuction(root, s);
        char* ptr=new char[s.size()+1];
        for(int i=0;i<s.size();i++)
            ptr[i]=s[i];
        ptr[s.size()]='\0';
        return ptr;
    }

    TreeNode* DeserializeFuction(char** str){
        if(**str=='#'){
            (*str)++;
            return nullptr;
        }

        int num=0;
        while(**str!=' '&&**str!='\0'){
            num=num*10+((**str)-'0');
            (*str)++;
        }
        TreeNode* root=new TreeNode(num);
        if(**str=='\0')
            return root;
        else
            (*str)++;
        root->left=DeserializeFuction(str);
        root->right=DeserializeFuction(str);
        return root;
    }

    TreeNode* Deserialize(char *str) {
        TreeNode* p=DeserializeFuction(&str);
        return p;
    }
};