剑指offer-序列化二叉树与反序列化二叉树

实现两个函数,分别用于序列化和反序列化二叉树。

序列化二叉树,给定一棵二叉树,以某种方式遍历它,空孩子节点用'#'表示,数字之间用逗号分割开来。

比如

序列化的结果是:1,2,4,###3,5,##6,##

序列化过程,可以考虑二叉树的前序遍历方法进行序列化。

    //将int型数据转换为str
    string to_string(int val)
    {
        string res="";
        while(val)
        {
            int num=val%10;
            char temp=num+48;
            res+=temp;
            val/=10;
        }
        reverse(res.begin(),res.end());
        return res;
    }
    
    string str="";
    
    //序列化主函数
    void S_core(TreeNode *root,string &str)
    {
        if(root==NULL)
        {
            str+='#';
            return;
        }
        
        else
        {
            str+=to_string(root->val);
            str+=',';
            S_core(root->left,str);
            S_core(root->right,str);
        }
    }
    
    //序列化函数
    char* Serialize(TreeNode *root) {    
        if(root==NULL)
            return NULL;

        S_core(root,str);
        char *s=new char[str.size()+1];
        for(int i=0;i<str.size();i++)
        {
            s[i]=str[i];
        }
        s[str.size()]='\0';
        return s;
    }

与序列化对应的反序列化也采用前序遍历的方式

注意D_core函数参数是引用,也可以用二级指针。

    //反序列化主函数
    TreeNode* D_core(char* &str)
    {
        if(*str=='#')
        {
            str++;
            return NULL;
        }
        
        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=D_core(str);
        root->right=D_core(str);
        
        return root;
    }
    
    //反序列化函数
    TreeNode* Deserialize(char *str) {
        if(str==NULL)
            return NULL;
        else
            return D_core(str);
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值