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

 设计一个算法,并编写代码来序列化和反序列化二叉树。将树写入一个文件被称为“序列化”,读取文件后重建同样的二叉树被称为“反序列化”。
class Solution {
public:
     
    void serializeHelper(TreeNode *root,string &str){//按先序DFS序列化
        if(root==NULL){
            str+="#,";
            return ;
        }
        str+=to_string(root->val);//int转string 
        str+=',';
        serializeHelper(root->left,str);
        serializeHelper(root->right,str);
    }
    TreeNode* deserializeHelper(string &str){//反序列化
        if(str.empty())return NULL;
        if(str[0]=='#'){//当前字符对应空结点,跳过
            str=str.substr(2);//跳过当前'#'和','开始截取
            return NULL;//返回空子树
        }
        TreeNode *pRoot=new TreeNode(stoi(str));//stoi:string转int,后面出现逗号被截断(逗号属于非法字符),只转换当前数字字符(函数原型类似atoi)
        str=str.substr(str.find_first_of(',')+1);//跳过下一个逗号截取
        pRoot->left=deserializeHelper(str);//重建左子树
        pRoot->right=deserializeHelper(str);//重建右子树
        return pRoot;
    }
     
    char* Serialize(TreeNode *root) {   
         if(root==NULL)return NULL;
         string str("");
         serializeHelper(root,str);
         char* res=new char[str.size()+1];
         strcpy(res,str.c_str());//c_str()函数:把string转char *
         return res;
    }
    TreeNode* Deserialize(char *str) {
        if(str==NULL)return NULL;
        string s(str);
        return deserializeHelper(s);
    }
     
};

  

特别的,记录一下两种int转字符串的方法:

1.to_string

string to_string (int val);
string to_string (long val);
string to_string (long long val);
string to_string (unsigned val);
string to_string (unsigned long val);
string to_string (unsigned long long val);
string to_string (float val);
string to_string (double val);
string to_string (long double val)

不仅int可以转换成string,这些都可以。

2.字符串流

标准库定义了三种类型字符串流:istringstream,ostringstream,stringstream

看名字就知道这几种类型和iostream中的几个非常类似,分别可以读、写以及读和写string类型,它们也确实是从iostream类型派生而来的。

要使用它们需要包含sstream头文件。

除了从iostream继承来的操作

1.sstream类型定义了一个有string形参的构造函数,

即:  stringstream stream(s); 创建了存储s副本的stringstream对象,s为string类型对象

2.定义了名为str的成员,用来读取或设置stringstream对象所操纵的string值:

stream.str(); 返回stream中存储的string类型对象

stream.str(s); 将string类型的s复制给stream,返回void

于是……

string Int_to_String(int n)

{

ostringstream stream;

stream<<n;  //n为int类型

return stream.str();

}

原文地址:https://www.cnblogs.com/curo0119/p/8783616.html