二叉树的序列化和反序列化
设计一个算法,并编写代码来序列化和反序列化二叉树。将树写入一个文件被称为“序列化”,读取文件后重建同样的二叉树被称为“反序列化”。
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();
}