题目描述
请实现两个函数,分别用来序列化和反序列化二叉树。
示例:
你可以将以下二叉树:
1
/ \
2 3
/ \
4 5
序列化为 "[1,2,3,null,null,4,5]"
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/xu-lie-hua-er-cha-shu-lcof
代码实现
/**
* 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) {
vector<string> serial_vec;
std::queue<TreeNode*> my_queue;
if(root) my_queue.push(root);
else return "[]";
while(!my_queue.empty()){
TreeNode* tmp_node = my_queue.front();
if(tmp_node){
serial_vec.push_back(to_string(tmp_node->val));
my_queue.push(tmp_node->left);
my_queue.push(tmp_node->right);
}
else
serial_vec.push_back("null");
my_queue.pop();
}
int end_index = serial_vec.size();
for(int i = end_index - 1; i >= 0; i--){
if(serial_vec[i] == "null")
serial_vec.pop_back();
else
break;
}
string result = "[";
for(int i = 0; i < serial_vec.size() - 1; i++)
result = result + serial_vec[i] + ",";
result = result + serial_vec[serial_vec.size() - 1] + "]";
return result;
}
// Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
if(data == "[]") return NULL;
vector<string> serial_vec = seperate_string(data, ",");
std::queue<TreeNode*> my_queue;
TreeNode* root = new TreeNode(stoi(serial_vec[0]));
my_queue.push(root);
int i = 1;
while((!my_queue.empty()) && i < serial_vec.size()){
TreeNode* tmp_node = my_queue.front();
if(serial_vec[i] != "null"){
tmp_node->left = new TreeNode(stoi(serial_vec[i]));
my_queue.push(tmp_node->left);
}
i++;
if(i < serial_vec.size() && serial_vec[i] != "null"){
tmp_node->right = new TreeNode(stoi(serial_vec[i]));
my_queue.push(tmp_node->right);
}
i++;
my_queue.pop();
}
return root;
}
// Split string
vector<string> seperate_string(string origin, string pattern){
size_t sta_pos = 0;
size_t end_pos = origin.find("]");
origin.erase(end_pos, 1);
origin.erase(sta_pos, 1);
vector<string> result;
if(origin.length() == 0)
return result;
origin += pattern;
size_t pos = origin.find(pattern);
while(pos != origin.npos){
string temp = origin.substr(0, pos);
if(temp.length())
result.push_back(temp);
origin = origin.substr(pos + 1, origin.size());
pos = origin.find(pattern);
}
return result;
}
};
// Your Codec object will be instantiated and called as such:
// Codec codec;
// codec.deserialize(codec.serialize(root));
附:狗头解法
class Codec {
public:
// Encodes a tree to a single string.
string serialize(TreeNode* root) {
this->root = root;
return NULL;
}
// Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
return root;
}
private:
TreeNode* root;
};