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

    这题挺有意思的,开始有好几个问题都没有意识到,自己调试时没调到结果,只是在本地看了一下中间结果,发现对了,后来提交总是出问题。(实际这题牛客网没有检查中间序列化的结果,只看最终反序列化后的树)

    发现了自己的几处问题:

    1、一开始没有用cur计数,只用了str,它是char*类型,导致在子函数变化过程中,它没有随着子函数的改变

    2、 反序列化的程序中,root的节点的构造是在子函数中,当回到主程序中,root原来new出来的节点会丢失,导致内存泄露(即明明new出来的节点的地址复制给root,但却是临时变量,回到主函数,临时变量销毁,导致new出来的内存的地址丢失),所以这时root仍然为空。

     应该用个变量保存root的指针的地址,传递root的指针的地址。

     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         string s = "";
    15         serl(root, s);
    16         char *p = new char[s.size()+1];
    17         int i;
    18         for( i=0; i<s.size(); i++)
    19         {
    20             p[i] = s[i];
    21         }
    22         p[i] = '';
    23         return p;
    24     }
    25     
    26     TreeNode* Deserialize(char *str) {
    27         TreeNode* root = NULL;
    28         TreeNode** head = &root;
    29         int cur = 0;
    30         desl(head, str, cur);
    31         return *head;
    32     }
    33     
    34 private:
    35     string itos(int n)
    36     {
    37         string str;
    38         while(n != 0)
    39         {
    40             str += n%10 + '0';
    41             n = n/10;
    42         }
    43         int i=0, j=str.size()-1;
    44         while(i < j)
    45         {
    46             char tmp = str[i];
    47             str[i] = str[j];
    48             str[j] = tmp;
    49             i++;
    50             j--;
    51         }
    52         return str;
    53     }
    54     
    55     void serl(TreeNode *root, string &s)
    56     {
    57         if(root == NULL)
    58         {
    59             s += "#,";
    60             return ;
    61         }
    62         s +=itos(root->val)+',';
    63         serl(root->left,s);
    64         serl(root->right,s);
    65     }
    66     
    67     int ctoi(char *str ,int &cur)
    68     {
    69         int num=0;
    70         while(*(str+cur) !='' && *(str+cur) != '#' && *(str+cur) != ',')
    71         {
    72             num = num*10 + *(str+cur)-'0';
    73             cur++;
    74         }
    75         return num;
    76     }
    77     
    78     void desl(TreeNode **root, char *str, int &cur)
    79     {
    80         if(*(str+cur) == '')
    81             return ;
    82         int num =0;
    83         if(*(str+cur) == '#')
    84         {
    85             cur +=2;
    86             *root = NULL;
    87             return ;
    88         }
    89         num = ctoi(str,cur);
    90         *root = new TreeNode(num);
    91         cur +=1;
    92         /*root->val = num;
    93         root->left = NULL;
    94         root->right = NULL;*/
    95         desl(&((*root)->left), str, cur);
    96         desl(&((*root)->right), str, cur);
    97         
    98     }
    99 };
  • 相关阅读:
    康复计划
    Leetcode 08.02 迷路的机器人 缓存加回溯
    Leetcode 38 外观数列
    Leetcode 801 使序列递增的最小交换次数
    Leetcode 1143 最长公共子序列
    Leetcode 11 盛水最多的容器 贪心算法
    Leetcode 1186 删除一次得到子数组最大和
    Leetcode 300 最长上升子序列
    Leetcode95 不同的二叉搜索树II 精致的分治
    Leetcode 1367 二叉树中的列表 DFS
  • 原文地址:https://www.cnblogs.com/daocaorenblog/p/5469477.html
Copyright © 2011-2022 走看看