剑指37:序列化二叉树 -------C++11 to_string函数

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


二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。

    序列化可以基于 先序、中序、后序、按层 的二叉树遍历方式来进行修改。原理都是一样的(即遍历顺序不同而已,对每个结点的处理都是一样的),序列化的结果是一个字符串,序列化时通过  某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。

  二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。

借鉴方法1:

        return (char*)res;    
typedef TreeNode node;
typedef TreeNode* pnode;
typedef int* pint;
class Solution {
    vector<int> buf;
    void dfs(pnode p){
        if(!p) buf.push_back(0x23333);
        else{
            buf.push_back(p -> val);
            dfs(p -> left);
            dfs(p -> right);
        }
    }
    pnode dfs2(pint& p){
        if(*p == 0x23333){
            ++p;
            return NULL;
        }
        pnode res = new node(*p);
        ++p;
        res -> left = dfs2(p);
        res -> right = dfs2(p);
        return res;
    }
public:
    char* Serialize(TreeNode *p) {
        buf.clear();
        dfs(p);
        int *res = new int[buf.size()];
        for(unsigned int i = 0; i < buf.size(); ++i) res[i] = buf[i];
        return (char*)res;       //将int数组转char*字符串         
    }
    TreeNode* Deserialize(char *str) {
        int *p = (int*)str;
        return dfs2(p);
    }
};
借鉴方法2:  to_string()函数
/*
 1. 对于序列化:使用前序遍历,递归的将二叉树的值转化为字符,并且在每次二叉树的结点
不为空时,在转化val所得的字符之后添加一个' , '作为分割。对于空节点则以 '#' 代替。
 2. 对于反序列化:按照前序顺序,递归的使用字符串中的字符创建一个二叉树(特别注意:
在递归时,递归函数的参数一定要是char ** ,这样才能保证每次递归后指向字符串的指针会
随着递归的进行而移动!!!)
*/
class Solution {  
public:
    char* Serialize(TreeNode *root) {
       if(root == NULL)
           return NULL;
        string str;
        Serialize(root, str);
        char *ret = new char[str.length() + 1];
        int i;
        for(i = 0; i < str.length(); i++){
            ret[i] = str[i];
        }
        ret[i] = '\0';
        return ret;
    }
    void Serialize(TreeNode *root, string& str){
        if(root == NULL){
            str += '#';
            return ;
        }
        string r = to_string(root->val);
        str += r;
        str += ',';
        Serialize(root->left, str);
        Serialize(root->right, str);
    }
     
    TreeNode* Deserialize(char *str) {
        if(str == NULL)
            return NULL;
        TreeNode *ret = Deserialize(&str);
 
        return ret;
    }
    TreeNode* Deserialize(char **str){//由于递归时,会不断的向后读取字符串
        if(**str == '#'){  //所以一定要用**str,
            ++(*str);         //以保证得到递归后指针str指向未被读取的字符
            return NULL;
        }
        int num = 0;
        while(**str != '\0' && **str != ','){
            num = num*10 + ((**str) - '0');
            ++(*str);
        }
        TreeNode *root = new TreeNode(num);
        if(**str == '\0')
            return root;
        else
            (*str)++;
        root->left = Deserialize(str);
        root->right = Deserialize(str);
        return root;
    }
};






https://blog.csdn.net/lzuacm/article/details/52704931

定义于头文件

std::string to_string( int value ); (1) (C ++11起)
std::string to_string( long value ); (2) (C ++11起)
std::string to_string( long long value ); (3) (C ++11起)
std::string to_string( unsigned value ); (4) (C ++11起)
std::string to_string( unsigned long value ); (5) (C ++11起)
std::string to_string( unsigned long long value ); (6) (C ++11起)
std::string to_string( float value ); (7) (C ++11起)
std::string to_string( double value ); (8) (C ++11起)
std::string to_string( long double value ); (9) (C ++11起)

std::to_string是C++标准(2011年)的最新版本中引入的功能。旧的编译器可能不支持它。

1) 有符号十进制整数转换为字符串内容相同的std::sprintf(buf, “%d”, value)会产生足够大的buf.

2) 有符号十进制整数转换为字符串内容相同的std::sprintf(buf, “%ld”, value)会产生足够大的buf.

3) 有符号十进制整数转换为字符串内容相同的std::sprintf(buf, “%lld”, value)会产生足够大的buf.

4)std::sprintf(buf, "%u", value)会产生足够大的buf了同样内容的一个字符串转换成一个无符号十进制整数.

5)std::sprintf(buf, "%lu", value)会产生足够大的buf了同样内容的一个字符串转换成一个无符号十进制整数.

6)std::sprintf(buf, "%llu", value)会产生足够大的buf了同样内容的一个字符串转换成一个无符号十进制整数.

6)std::sprintf(buf, "%llu", value)会产生足够大的buf了同样内容的一个字符串转换成一个无符号十进制整数.
@ 7,8 @std::sprintf(buf, "%f", value)会产生足够大的buf了同样内容的一个字符串转换成一个浮点值.

9) std::sprintf(buf, "%Lf", value)会产生足够大的buf了同样内容的一个字符串转换成一个浮点值.

参数

value - 一个数值转换

返回值

一个字符串保持转换后的值

猜你喜欢

转载自blog.csdn.net/yanbao4070/article/details/80020720