每日一題,防止癡呆 = =
一、題目大意
序列化是將一個數據結構或者對象轉換爲連續的比特位的操作,進而可以將轉換後的數據存儲在一個文件或者內存中,同時也可以通過網絡傳輸到另一個計算機環境,採取相反方式重構得到原數據。
請設計一個算法來實現二叉樹的序列化與反序列化。這裏不限定你的序列 / 反序列化算法執行邏輯,你只需要保證一個二叉樹可以被序列化爲一個字符串並且將這個字符串反序列化爲原始的樹結構。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/serialize-and-deserialize-binary-tree
二、題目思路以及AC代碼
思路:
這題的思路沒有什麼好說的,並沒有唯一的答案,只要你自己的序列化和反序列化是一致的就可以。這裏我採用的是BFS層序遍歷的方法,剩下的就是實現的問題,可以參照代碼。
AC代碼:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Codec {
public:
// Encodes a tree to a single string.
string serialize(TreeNode* root) {
string res = "";
if (!root) return res;
queue<TreeNode*> q;
q.push(root);
while (!q.empty()) {
int q_size = q.size();
for (int i=0;i<q_size;i++) {
TreeNode* cur = q.front(); q.pop();
if (cur == NULL) {
res += "NULL,";
continue;
}
res += to_string(cur->val) + ",";
q.push(cur->left);
q.push(cur->right);
}
}
return res;
}
// Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
if (data.empty()) return NULL;
int pos = data.find_first_of(",");
TreeNode* root = new TreeNode(atoi(data.substr(0, pos).c_str()));
queue<TreeNode*> q;
q.push(root);
int len = data.length();
string tmp = "";
TreeNode* Lchild;
bool flag = false;
for (int i=pos + 1;i<len;i++) {
if (data[i] == ',') {
if (tmp == "NULL") {
if (flag) {
TreeNode* cur = q.front(); q.pop();
if (cur)
cur->left = Lchild;
flag = false;
}
else {
Lchild = NULL;
flag = true;
}
}
else {
int val = atoi(tmp.c_str());
if (flag) {
TreeNode* Rchild = new TreeNode(val);
q.push(Rchild);
TreeNode* cur = q.front(); q.pop();
cur->left = Lchild;
cur->right = Rchild;
flag = false;
}
else {
Lchild = new TreeNode(val);
q.push(Lchild);
flag = true;
}
}
tmp = "";
}
else
tmp += data[i];
}
return root;
}
};
// Your Codec object will be instantiated and called as such:
// Codec codec;
// codec.deserialize(codec.serialize(root));
如果有問題,歡迎大家指正!!!