Leetcode: 449.二叉搜尋樹的序列化和反序列化
阿新 • • 發佈:2018-12-11
序列化是將資料結構或物件轉換為一系列位的過程,以便它可以儲存在檔案或記憶體緩衝區中,或通過網路連線鏈路傳輸,以便稍後在同一個或另一個計算機環境中重建。
設計一個演算法來序列化和反序列化二叉搜尋樹。 對序列化/反序列化演算法的工作方式沒有限制。 您只需確保二叉搜尋樹可以序列化為字串,並且可以將該字串反序列化為最初的二叉搜尋樹。
編碼的字串應儘可能緊湊。
注意:不要使用類成員/全域性/靜態變數來儲存狀態。 你的序列化和反序列化演算法應該是無狀態的。
解題思路:
層次遍歷,數字和字串的相互轉化。利用層次遍歷獲取二叉樹對應的字串,然後利用層次遍歷的思想將字串轉換成二叉樹。
注意事項:
- 二叉樹中可能有0或者負值,0與NULL轉換成int的值是一樣的,為了避免識別上的困難,將每一個val用[]括起來,比如,[NULL],[0],構建二叉樹時,先不要急著轉int,先判斷是數字字串還是NULL,避免出錯。
- 本題採用了字串流,對字串轉int以及int轉字串等操作,由於轉換次數過多,存在較多的clear操作,個人認為這是導致不能擊敗100%的原因。執行時間達到20ms,與100%的程式碼16ms相差4ms。
class Codec { public: // Encodes a tree to a single string. string serialize(TreeNode* root) { stringstream ss; queue<TreeNode*> Q; Q.push(root); TreeNode* temp; string res,sub; while (!Q.empty()) { temp = Q.front(); if (!temp) { res += "[NULL]"; } else { ss.clear(); ss << temp->val; ss >> sub; sub = "[" + sub + "]"; res += sub; Q.push(temp->left); Q.push(temp->right); } Q.pop(); } return res; } // Decodes your encoded data to tree. TreeNode* deserialize(string data) { vector<string> Data; int size = data.size(),i; for (i = 1; i <= size; i++) { if (data[i - 1] == '[') Data.push_back(""); else if (data[i - 1] == ']') {} else { Data.back().push_back(data[i - 1]); } } if (Data[0] == "NULL") return NULL; stringstream ss; int pos = 1; queue<TreeNode*> Q; TreeNode* root = new TreeNode(0); ss << Data[0]; ss >> root->val; Q.push(root); TreeNode* temp; while (!Q.empty()) { temp = Q.front(); if (Data[pos] == "NULL") { temp->left = NULL; } else { ss.clear(); temp->left = new TreeNode(0); ss << Data[pos]; ss >> temp->left->val; Q.push(temp->left); } if (Data[pos + 1] == "NULL") { temp->right = NULL; } else { ss.clear(); temp->right= new TreeNode(0); ss << Data[pos + 1]; ss >> temp->right->val; Q.push(temp->right); } Q.pop(); pos += 2; } return root; } }; |