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 };
  • 相关阅读:
    SSL证书指令
    重启机器解决SSL都要输入密码问题
    Nginx + Apache 反向代理
    Ubuntu Nginx安装
    Nginx配置文件详解
    Linux SSL 双向认证 浅解
    SSL 双向认证
    linux ssl 双向认证
    ubuntu apache2 ssl配置
    vi编辑器命令
  • 原文地址:https://www.cnblogs.com/daocaorenblog/p/5469477.html
Copyright © 2011-2022 走看看