zoukankan      html  css  js  c++  java
  • 【剑指offer】序列化二叉树

    题目链接:序列化二叉树

     

    题意:

    请实现两个函数,分别用来序列化和反序列化二叉树
     
    二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。

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

     

    题解:这个题就是前序遍历,序列化二叉树,然后反序列化重构二叉树。具体的看代码吧。

    这题好复杂。思路倒是很简单。。参考了下剑指里的写法。。QAQ

     

    代码:

     1 /*
     2 struct TreeNode {
     3     int val;
     4     struct TreeNode *left;
     5     struct TreeNode *right;
     6     TreeNode(int x) :
     7             val(x), left(NULL), right(NULL) {
     8     }
     9 };
    10 */
    11 class Solution {
    12 public:
    13     char* Serialize(TreeNode *root) {    
    14         if(root == NULL)    return NULL;
    15         string str;
    16         Serialize(root,str);
    17         //string转char*字符串
    18         int len = str.length();
    19         char* ans = new char[len+1];
    20         for(int i =0 ; i < len;i++){
    21             ans[i] = str[i];
    22         }
    23         ans[len] = '';
    24         return ans;
    25     }
    26     TreeNode* Deserialize(char* str) {
    27         if(str == NULL)    return NULL;
    28         TreeNode* ans =  Deserialize(&str);
    29         return ans;
    30     }
    31     
    32     void Serialize(TreeNode* root,string& str){
    33         if(root == NULL){
    34             str += '#'; return;
    35         }//指针为空
    36         
    37         string tmp = to_string(root->val);
    38         str += tmp;
    39         str +=',';    //区分每个节点,先序遍历
    40         Serialize(root->left,str);
    41         Serialize(root->right,str);
    42     }
    43     //char**的声明很重要。
    44      TreeNode* Deserialize(char** str){
    45          //到达叶节点
    46          if(**str == '#'){
    47              (*str)++; return NULL;
    48          }
    49          //转换字符
    50          int num = 0;
    51          while(**str != ',' && **str !=''){
    52              num = num*10+((**str) - '0');
    53              (*str)++;
    54          }
    55          //建树
    56          TreeNode* root = new TreeNode(num);
    57          if(**str =='')    return root;
    58          else    (*str)++;
    59          root->left = Deserialize(str);
    60          root->right = Deserialize(str);
    61          return root;
    62      }
    63 };
  • 相关阅读:
    点击空白处隐藏盒子
    java缓存技术
    使用Java处理大文件
    java实现把一个大文件切割成N个固定大小的文件
    笔记:Java的IO性能调整
    NIO之轻松读取大文件
    java读写文件,读超大文件
    java读取大文件 超大文件的几种方法
    java web服务器cpu占用过高的处理
    软件开发各类文档模板
  • 原文地址:https://www.cnblogs.com/Asumi/p/12431669.html
Copyright © 2011-2022 走看看