序列化和反序列化二叉树

题目描述

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

基本思想很简单,序列化就是用某一种遍历方法将二叉树元素存储在字符串数组中,当然要一个个元素分离,分得清谁是谁。反序列化就是把存储在字符串数组中的元素进行重构,使之成为二叉树。我们不妨选择前序遍历的思想进行搜索与重构。本题的关键是如何对元素进行存储,可以放在char**或者vector<string>或者字符串流o/istringstream中(为什么不放在char*或者string中,其实也可以,只不过要添加分割符让元素之间分离),我们选择字符串流,这个做起来比较简单。代码如下:

class Solution {
public:
    char* Serialize(TreeNode *root) {    
      ostringstream out;
      Serialize(root,out);
      string str=out.str();
      char* re=new char[str.size()+1];
      strcpy(re,str.c_str());
      return re;
    }
    TreeNode* Deserialize(char *str) {
        string s=str;
        istringstream in(s);
        return Deserialize(in);
    }
    void Serialize(TreeNode *root,ostringstream& out)
    {
        if(root==NULL){
            out<<"# ";
        }else{
            out<<root->val<<' ';
            Serialize(root->left,out);
            Serialize(root->right,out);
        }
    }
    TreeNode* Deserialize(istringstream& in)
    {
        string val;
        in>>val;
        if(val=="#"){
            return NULL;
        }
        TreeNode* root=new TreeNode(stoi(val));
        root->left=Deserialize(in);
        root->right=Deserialize(in);
        return root;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值