美文网首页
38. 序列化和反序列化二叉树

38. 序列化和反序列化二叉树

作者: HamletSunS | 来源:发表于2019-08-07 17:20 被阅读0次

题目:
直白些翻译就是把一个二叉树转换成一个字符串(序列化),同时你又可以根据这个字符串把这棵二叉树还原回来(反序列化)

思路:

  • 一种比较复杂的思路是结合重建二叉树的题目,找到前序遍历、中序遍历,然后使用重建二叉树的方法实现反序列化,这样序列化则比较容易了,就是前序遍历和中序遍历。整体操作和设计较复杂
  • 一种比较思路清晰的方式是只用二叉树的一种遍历方式,比如前序遍历,但是把空指针也表示出来,这样只需要遍历一次就可以实现序列化,同时因为表示了空指针,也能达到反序列化的效果

难点:
序列化过程:

  • string中需要用到哪些方法?
    • int变str,用来保存树节点的数据,to_string(int val)
    • 拼接操作,用来把各个节点拼接起来,以及添加分隔符 string str1+char char2 或者 string str1 + string str2

反序列化过程:

  • string中需要用到哪些方法?
    • 题目中用的char *
  • 字符串中的数字如何变成整型?
    • num*10+char-‘0’
  • 注意反序列化的过程中到达结尾处'\0'的处理,遇到'\0'要返回当前构造的node。
  • 注意值有可能是负数,所以还需要设置一个bool标志变量

指针型的引用变量:

  • char *&p 代表传入函数的是同一个指针p
  • char &*p 没有这种写法
  • 拓展说一说const, const char * p,char const * p两种写法是等价的,代表p指针指向的是一个常量,不能通过p去修改p的值,但可以改变p的指向,编译器会认为p指向谁,谁就是常量;char * const p,p指针本身是常量,不能修改p指针的指向,但可以修改p的值

代码:
100%正确的代码

class Codec {
public:

    // Encodes a tree to a single string.
    string serialize(TreeNode* root) {
        string str;
        if(root==nullptr)
            return str;//不要返回NULL或nullptr,否则反序列化会出错,
//因为cpp中无法判断string对象是否为null值
        
        serialize(root,str);
        return str;
    }
    
    void serialize(TreeNode *root,string &str){
        if(root==nullptr){
            str+='#';
            return ;
        }
        str+=to_string(root->val);
        str+=',';
        serialize(root->left,str);
        serialize(root->right,str);
        
         
    }

    // Decodes your encoded data to tree.
    TreeNode* deserialize(string data) {
        if(data.empty())
            return nullptr;
        int n=0;
        return deserialize(data,n);
    }
    //使用&str可以节省大量内存空间,也会提高程序运行效率
    TreeNode *deserialize(string &str,int &index){
        if(str.empty())
            return nullptr;
        if(str[index]=='#')
            {
            index++;
            return nullptr;}
        int num=0;
        bool flag=false;
        if(str[index]=='-'){
            flag=true;
            index++;
        }
        while(str[index]!=',' && index<str.size()){
            num*=10;
            num+=str[index]-'0';
            index++;
        }
        if(flag)
            num*=-1;
        TreeNode *node=new TreeNode(num);
        if(index==str.size())
            return node;
        else
            index++;
        node->left=deserialize(str,index);
        node->right=deserialize(str,index);
        return node;
    }
};

牛客网上可以通过,但实际上可能会有些问题

class Solution {
public:
    char* Serialize(TreeNode *root) {    
       string str;  
       Serialize(root,str);
        int n=str.size();
       char *ret=new char[n+1];
        for(int i=0;i<n;i++)
            ret[i]=str[i];
        ret[n]='\0';
        return ret;
    }
    TreeNode* Deserialize(char *str) {
        if(str==nullptr)
            return nullptr;
        TreeNode *root=Deserialize2(str);
        return root;
    }
    TreeNode *Deserialize2(char *&str){
        
        if(str==nullptr)
            return nullptr;
        
        if(*str=='#'){
            str++;
            return nullptr;
        }
        int num=0;
        while(*str!=',' && *str!='\0')
           { num=num*10+*str-'0';
               str++;
           }
        TreeNode *node=new TreeNode(num);
       if(*str=='\0')
          return node;
        else
            str++;
        node->left=Deserialize2(str);
        node->right=Deserialize2(str);
        return node;
    }
    void Serialize(TreeNode *root,string &str){
        if(root==nullptr)
            {str+='#';
             return ;
            }
        
        str+=to_string(root->val);
        str+=',';
        Serialize(root->left,str);
        Serialize(root->right,str);
    }
};

相关文章

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

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

  • 剑指Offer-61 二叉树序列化

    请实现两个函数,分别用来序列化和反序列化二叉树 利用广度遍历实现二叉树的序列化和非序列化。核心思想:广度遍历

  • 二叉树的三种遍历方法

    二叉树的序列化 为了方便构造二叉树来验证我们的算法,这里先介绍下二叉树的序列化和反序列化。 序列化 先序遍历整颗二...

  • LeetCode:序列化二叉树

    面试题37. 序列化二叉树 请实现两个函数,分别用来序列化和反序列化二叉树。示例:你可以将以下二叉树: 序列化为 ...

  • 剑指offer刷题记录(C++版本)(之七)

    61.序列化二叉树??? 题目:请实现两个函数,分别用来序列化和反序列化二叉树 二叉树的序列化是指:把一棵二叉树按...

  • JZ-061-序列化二叉树

    序列化二叉树 题目描述 请实现两个函数,分别用来序列化和反序列化二叉树。二叉树的序列化是指:把一棵二叉树按照某种遍...

  • 面试题37:序列化二叉树

    题目 实现两个函数,分别用来序列化和反序列化二叉树 解题思路 序列化根据前序遍历的顺序序列化二叉树,从根节点开始,...

  • 37:序列化二叉树

    题目37:序列化二叉树 请实现两个函数,分别用来序列化和反序列化二叉树。将树写入一个文件被称为“序列化”,读取文件...

  • 剑指offer 38- 序列化二叉树

    请实现两个函数,分别用来序列化和反序列化二叉树。 您需要确保二叉树可以序列化为字符串,并且可以将此字符串反序列化为...

  • 剑指offer - 序列化二叉树

    题目 请实现两个函数,分别序列化和反序列化二叉树。这里的序列化指的是将一棵二叉树保存到文件中,反序列化就是从文件中...

网友评论

      本文标题:38. 序列化和反序列化二叉树

      本文链接:https://www.haomeiwen.com/subject/qecadctx.html