二叉樹的序列化與反序列化
序列化是將一個數據結構或者對象轉換爲連續的比特位的操作,進而可以將轉換後的數據存儲在一個文件或者內存中,同時也可以通過網絡傳輸到另一個計算機環境,採取相反方式重構得到原數據。
請設計一個算法來實現二叉樹的序列化與反序列化。這裏不限定你的序列 / 反序列化算法執行邏輯,你只需要保證一個二叉樹可以被序列化爲一個字符串並且將這個字符串反序列化爲原始的樹結構。
示例:
你可以將以下二叉樹:
提示: 這與 LeetCode 目前使用的方式一致,詳情請參閱 LeetCode 序列化二叉樹的格式。你並非必須採取這種方式,你也可以採用其他的方法解決這個問題。
說明: 不要使用類的成員 / 全局 / 靜態變量來存儲狀態,你的序列化和反序列化算法應該是無狀態的。
class Codec
{
public:
// Encodes a tree to a single string.
string serialize(TreeNode *root)
{
if (!root)
{
return "[]";
}
queue<TreeNode *> Q;
string res = "[";
Q.push(root);
while (!Q.empty())
{
TreeNode *cur_node = Q.front();
Q.pop();
if (cur_node)
{
res += to_string(cur_node->val) + ",";
if (Q.size() == 0 && !cur_node->left && !cur_node->right)
{
break;
}
Q.push(cur_node->left);
Q.push(cur_node->right);
}
else
{
res += "null,";
}
}
res.pop_back();
res += "]";
return res;
}
// Decodes your encoded data to tree.
TreeNode *deserialize(string data)
{
if (data.size() == 2)
return NULL;
data.erase(data.begin());
int size = data.size();
int i = 0;
string word = "";
vector<TreeNode *> node_vec;
while (i < size)
{
while (data[i] != ',' && data[i] != ']')
{
word += data[i];
i++;
}
TreeNode *wait_to_push = (word == "null") ? NULL : new TreeNode(stoi(word));
node_vec.push_back(wait_to_push);
word = "";
i++;
}
int j = 0;
queue<TreeNode *> Q;
Q.push(node_vec[j++]);
while (!Q.empty())
{
TreeNode *cur_node = Q.front();
Q.pop();
if (cur_node)
{
if (j < node_vec.size())
{
TreeNode *node1 = node_vec[j++];
cur_node->left = node1;
// cout << cur_node->val << " left is " << node1->val << endl;
Q.push(node1);
}
if (j < node_vec.size())
{
TreeNode *node2 = node_vec[j++];
cur_node->right = node2;
// cout << cur_node->val << " right is " << node2->val << endl;
Q.push(node2);
}
}
}
// cout<<node_vec[0]->right->right->val<<endl;
return node_vec[0];
}
};