标签:
这题挺有意思的,开始有好几个问题都没有意识到,自己调试时没调到结果,只是在本地看了一下中间结果,发现对了,后来提交总是出问题。(实际这题牛客网没有检查中间序列化的结果,只看最终反序列化后的树)
发现了自己的几处问题:
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] = ‘\0‘; 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) !=‘\0‘ && *(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) == ‘\0‘) 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 };
标签:
原文地址:http://www.cnblogs.com/daocaorenblog/p/5469477.html