二叉树的序列化和反序列化

开始感觉有点难

主要是要运用递归的方式

采用先序列遍历来序列化节点

注意要delete掉中间内存

class Solution {
public:
    char * Str2Char( string str){
        char * rt_ptr = new char[str.length() + 1];
        rt_ptr [str.length()] = '\0';
        memcpy(rt_ptr , str.c_str() , str.length());
        return rt_ptr;
    }
    char* Serialize(TreeNode *root) {    
    	string rt_str ;
        if(root == NULL){
            rt_str = "$,";
            return Str2Char(rt_str);
        } 
        else {
            rt_str = to_string(root->val);
            rt_str+=",";
        }
        char * left = Serialize(root->left);
        char *right = Serialize(root->right);
        string left_str(left);
        string right_str(right);
        delete []left ;
        delete []right;
        rt_str += left_str;
        rt_str += right_str;
        return Str2Char(rt_str);
    }
    TreeNode * DeserializeFromString(string &str_ref){
        size_t pos = str_ref.find_first_of(",");
        string tmp = str_ref.substr(0,pos);
        str_ref = str_ref.substr(pos+1 , str_ref.length() - pos - 1);
        if(tmp == "$"){            
            return NULL;
        }else {
            TreeNode * rt_ptr = new TreeNode(atoi(tmp.c_str()));
            rt_ptr-> left = DeserializeFromString(str_ref);
            rt_ptr-> right = DeserializeFromString(str_ref);
            return rt_ptr;
        }
        
    }
    TreeNode* Deserialize(char *str) {
        if(str == NULL) return NULL;
        string input_str(str);
    	return DeserializeFromString(input_str);
    }
};class Solution {
public:
    char * Str2Char( string str){
        char * rt_ptr = new char[str.length() + 1];
        rt_ptr [str.length()] = '\0';
        memcpy(rt_ptr , str.c_str() , str.length());
        return rt_ptr;
    }
    char* Serialize(TreeNode *root) {    
    	string rt_str ;
        if(root == NULL){
            rt_str = "$,";
            return Str2Char(rt_str);
        } 
        else {
            rt_str = to_string(root->val);
            rt_str+=",";
        }
        char * left = Serialize(root->left);
        char *right = Serialize(root->right);
        string left_str(left);
        string right_str(right);
        delete []left ;
        delete []right;
        rt_str += left_str;
        rt_str += right_str;
        return Str2Char(rt_str);
    }
    TreeNode * DeserializeFromString(string &str_ref){
        size_t pos = str_ref.find_first_of(",");
        string tmp = str_ref.substr(0,pos);
        str_ref = str_ref.substr(pos+1 , str_ref.length() - pos - 1);
        if(tmp == "$"){            
            return NULL;
        }else {
            TreeNode * rt_ptr = new TreeNode(atoi(tmp.c_str()));
            rt_ptr-> left = DeserializeFromString(str_ref);
            rt_ptr-> right = DeserializeFromString(str_ref);
            return rt_ptr;
        }
        
    }
    TreeNode* Deserialize(char *str) {
        if(str == NULL) return NULL;
        string input_str(str);
    	return DeserializeFromString(input_str);
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值