zoukankan      html  css  js  c++  java
  • 二叉树的序列化和反序列化

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

    }

  • 相关阅读:
    ASP获取客户端硬件信息(CPU、硬盘、主板、mac地址等)
    Java(多态)动手动脑
    每周进度条(第二周)
    Java(异常处理)动手动脑
    软件工程概论课后作业1
    mysqlmmm官方安装指南翻译
    Mysql 字符集的修改步骤
    Amoeba搞定mysql主从读写分离
    邮件系统postfix安装和设置
    mysqlmmm实现mysql高可用
  • 原文地址:https://www.cnblogs.com/curo0119/p/8783616.html
Copyright © 2011-2022 走看看