在二叉树中,序列化是将二叉树转化为字符串,方便数据的存储和传输;
而反序列化是将字符串重构得到原来的二叉树,如图所示:
二叉树节点定义
// Definition for a binary tree node.
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
序列化代码
// Encodes a tree to a single string.
string serialize(TreeNode* root) {
if(root==nullptr){
return "[]";
}
stringstream ss;
ss << "[";
queue<TreeNode*> qee;
qee.push(root);
while(!qee.empty()){
TreeNode* node = qee.front();
qee.pop();
if(node==nullptr){
ss << "null,";
}else{
ss << node->val << ",";
qee.push(node->left);
qee.push(node->right);
}
}
string res = ss.str();
res[res.size()-1] = ']';
return res;
}
反序列化代码
// Decodes a encoded data to tree.
TreeNode* deserialize(string data) {
if(data.size()<=2){
return nullptr;
}
stringstream ss(data.substr(1,data.size()-2));
string item;
getline(ss, item, ',');
TreeNode* root = new TreeNode(stoi(item));
queue<TreeNode*> qee;
qee.push(root);
while(!qee.empty()){
TreeNode* node = qee.front();
qee.pop();
if(!getline(ss, item, ',')){
break;
}
if(item!="null"){
node->left = new TreeNode(stoi(item));
qee.push(node->left);
}
if(!getline(ss, item, ',')){
break;
}
if(item!="null"){
node->right = new TreeNode(stoi(item));
qee.push(node->right);
}
}
return root;
}