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));

浙公网安备 33010602011771号