leetcode 297 二叉树序列化与反序列化

序列化不困难,主要是序列化之后怎么能够反序列回来,所以需要在序列化的过程中加入空子树的指示符,以指示反序列化的结果。通过前序遍历的思路还是比较简单的,结果造成最大问题的是负数,在涉及负数的时候尤其要注意。

 1 /**
 2  * Definition for a binary tree node.
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 8  * };
 9  */
10 class Codec {
11 public:
12     // Encodes a tree to a single string.
13     void generate(TreeNode* root,string& str)
14     {
15         if(!root)
16         {
17             str += "N,";
18         }
19         else
20         {
21             str += to_string(root->val) + ",";
22             generate(root->left,str);
23             generate(root->right,str);
24         }
25     }
26     string serialize(TreeNode* root) 
27     {
28         string res;
29         generate(root,res);
30         return res;
31     }
32 
33     // Decodes your encoded data to tree.
34     TreeNode* rgenerate(list<string>& data)
35     {
36         if(data.empty())
37         return NULL;
38         if(data.front() == "N")
39         {
40             data.erase(data.begin());
41             return NULL;
42         }
43         TreeNode* this_root = new TreeNode(stoi(data.front()));
44         data.erase(data.begin());
45         this_root->left = rgenerate(data);
46         this_root->right = rgenerate(data);
47         return this_root;
48     }
49     TreeNode* deserialize(string data) 
50     {
51         list<string> list_data;
52         string str;
53         for(auto& temp:data)
54         {
55             if(temp == ',')
56             {
57                 list_data.push_back(str);
58                 str.clear();
59             }
60             else
61             {
62                 str.push_back(temp);
63             }
64         }
65 
66         return rgenerate(list_data);
67     }
68 };
69 
70 // Your Codec object will be instantiated and called as such:
71 // Codec ser, deser;
72 // TreeNode* ans = deser.deserialize(ser.serialize(root));

bfs的方法,还是用到了队列,与之前二叉树中的方法是类似的,写起来很舒服,贴代码

 1 /**
 2  * Definition for a binary tree node.
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 8  * };
 9  */
10 class Codec {
11 public:
12     // Encodes a tree to a single string.
13     string serialize(TreeNode* root) 
14     {
15         queue<TreeNode*> Node_que;
16         string res;
17         Node_que.push(root);
18         while(!Node_que.empty())
19         {
20             TreeNode* temp = Node_que.front();
21             Node_que.pop();
22             if(!temp)
23             {
24                 res += ("N,");
25             }
26             else
27             {
28                 res += (to_string(temp->val)+",");
29                 Node_que.push(temp->left);
30                 Node_que.push(temp->right);
31             }
32         }
33         return res;
34     }
35 
36     // Decodes your encoded data to tree.
37     TreeNode* deserialize(string data) 
38     {
39         vector<string> str_vec;
40         string str;
41         for(auto& temp:data)
42         {
43             if(temp == ',')
44             {
45                 str_vec.push_back(str);
46                 str.clear();
47             }
48             else
49             {
50                 str.push_back(temp);
51             }
52             
53         }
54         int n = str_vec.size();
55         if(n == 1)
56         return NULL;
57         TreeNode* root = new TreeNode(stoi(str_vec[0]));
58         queue<TreeNode*> Node_que;
59         Node_que.push(root);
60         int pos = 0;
61         while(!Node_que.empty())
62         {
63             TreeNode* Node_temp = Node_que.front();
64             Node_que.pop();
65             if(str_vec[pos+1] != "N" && pos+1 < n)
66             {
67                 TreeNode* left = new TreeNode(stoi(str_vec[pos+1]));
68                 Node_temp->left = left;
69                 Node_que.push(left);
70             }
71             if(str_vec[pos+2] != "N" && pos+2 < n)
72             {
73                 TreeNode* right = new TreeNode(stoi(str_vec[pos+2]));
74                 Node_temp->right = right;
75                 Node_que.push(right);
76             }
77             pos+=2;
78         } 
79         return root;       
80     }
81 };
82 
83 // Your Codec object will be instantiated and called as such:
84 // Codec ser, deser;
85 // TreeNode* ans = deser.deserialize(ser.serialize(root));

 更正,上述做法应该是层序遍历,也就是每一层每一层进行遍历,真正的前序遍历代码如下所示:

 1 /**
 2  * Definition for a binary tree node.
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 8  * };
 9  */
10 class Codec {
11 public:
12     string Res;
13     vector<string> tempStr;
14     int pointer = 0;
15     // Encodes a tree to a single string.
16     string serialize(TreeNode* root) 
17     {
18         preOrder(root);
19         return Res;
20     }
21     void preOrder(TreeNode* root)
22     {
23         if(!root)
24         {
25             Res+='N,';
26             return;
27         }
28         else
29         {
30             Res+=(to_string(root->val)+",");
31             preOrder(root->left);
32             preOrder(root->right);
33             return;
34         }
35     }
36 
37     // Decodes your encoded data to tree.
38     TreeNode* deserialize(string data) 
39     {
40         string tempString = data;
41         while(tempString.length())
42         {
43             int pos = tempString.find(',');
44             tempStr.push_back(tempString.substr(0,pos));
45             tempString = tempString.substr(pos+1);            
46         }
47         return preOrderReverse(tempStr[pointer]);
48     }
49     TreeNode* preOrderReverse(string t)
50     {
51         if(t == "N")
52         {
53             pointer++;
54             return NULL;
55         }
56         else
57         {
58             TreeNode* node = new TreeNode(atoi(t.c_str()));
59             pointer++;
60             node->left = preOrderReverse(tempStr[pointer]);
61             node->right = preOrderReverse(tempStr[pointer]);
62             return node;
63         }
64     }
65 };
66 
67 // Your Codec object will be instantiated and called as such:
68 // Codec ser, deser;
69 // TreeNode* ans = deser.deserialize(ser.serialize(root));

 

posted @ 2021-08-31 17:26  zhaohhhh  阅读(51)  评论(0)    收藏  举报