序列化二叉树

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

发现了自己的几处问题:

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 };
时间: 2024-08-14 01:21:33

序列化二叉树的相关文章

序列化二叉树-剑指Offer

序列化二叉树 题目描述 请实现两个函数,分别用来序列化和反序列化二叉树 思路 序列化就按先序遍历,遇到空指针也要存下来,递归调用,StringBuilder 反序列化是同样的递归调用,不过要考虑参数的传递,生成的TreeNode要返回 注意:对Sting[]的遍历,每次递归都要往后遍历一个字符,如果将这个位置信息point通过参数传入的话,就会造成函数无法正常遍历String[],此时,我们可以将位置信息设置为类的成员变量,每次递归时都要递增,这样既可满足条件 代码 /* public clas

剑指Offer——序列化二叉树

题目描述: 请实现两个函数,分别用来序列化和反序列化二叉树 分析: 先序遍历可以用来序列化二叉树,序列化过程中,我们用"0xFFFFFFFF"表示结点为NULL. 反序列化便很简单,遇到"0xFFFFFFFF"就返回NULL,其他时候就直接产生一个结点. 代码: 1 /* 2 struct TreeNode { 3 int val; 4 struct TreeNode *left; 5 struct TreeNode *right; 6 TreeNode(int x

※剑指offer系列50:序列化二叉树

先来说一下什么是序列化二叉树,就是把二叉树转换成一串序列.反序列化就是将一串序列构造成一个二叉树. 这个题我也不是很懂,为什么要这样写 1 class Solution { 2 public: 3 vector<int> aux; 4 void treetovec(TreeNode * root) 5 { 6 if (!root)//空节点 7 { 8 aux.push_back(0xFFFFFFFF); 9 } 10 else { 11 aux.push_back(root->val)

剑指Offer对答如流系列 - 序列化二叉树

面试题37:序列化二叉树 题目描述 请实现两个函数,分别用来序列化和反序列化二叉树. 树的结构定义如下: public class Node { int val = 0; Node left = null; Node right = null; public Node(int val) { this.val = val; } } 问题分析 一般情况下,需要采用前/后序遍历和中序遍历才能确定一个二叉树,具体的内容我们之前探讨过 剑指Offer对答如流系列 - 重建二叉树 但是采用这种方式进行序列化

LeetCode 297.序列化二叉树 - JavaScript

题目描述 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据. 请设计一个算法来实现二叉树的序列化与反序列化.这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构. 说明: 不要使用类的成员 / 全局 / 静态变量来存储状态,你的序列化和反序列化算法应该是无状态的. 序列化二叉树思路 使用广度优先(

50.序列化二叉树

代码 序列化二叉树 原文地址:https://www.cnblogs.com/make-big-money/p/12316231.html

剑指offer-37 序列化二叉树

剑指offer-37 序列化二叉树 题目: 思路: 自己解答: 这个有错误 public class Solution { String Serialize(TreeNode root) { if(root == null) return "#!"; StringBuilder bd = new StringBuilder(); serializeCore(root, bd); return bd.toString(); } private void serializeCore(Tre

【剑指offer】序列化二叉树

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

37. 序列化二叉树

面试题37. 序列化二叉树 请实现两个函数,分别用来序列化和反序列化二叉树. 示例: 你可以将以下二叉树: 1 / 2 3 / 4 5 序列化为 "[1,2,3,null,null,4,5]" /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * }

[剑指Offer] 61.序列化二叉树

题目描述 请实现两个函数,分别用来序列化和反序列化二叉树 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 { 13 public: 14 char* Serialize(TreeNode*