题目
请实现两个函数,分别用来序列化和反序列化二叉树。
示例:
你可以将以下二叉树:
1
/ \
2 3
/ \
4 5
序列化为 “[1,2,3,null,null,4,5]”
题解
思路:
代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
#include<queue>
class Codec {
public:
string serialize(TreeNode* root) {
string ans = "[";
if(!root) return "[]";
queue<TreeNode*> q;
q.push(root);
while(!q.empty()){
for(int i=0;i<q.size();i++){
TreeNode* t = q.front();
q.pop();
if(!t){
ans+="null,";
continue;
}
ans += to_string(t->val);
ans += ",";
q.push(t->left);
q.push(t->right);
}
}
ans.pop_back();//去掉末尾多余的逗号
return ans+"]";
}
TreeNode* deserialize(string data) {
if(data=="[]") return nullptr;
int idx=1;
vector<string> datas;
for(int i=0;i<data.size();i++){//装载datas
if(data[i]=='[') continue;
if(data[i]==','||data[i]==']'){
string s = data.substr(idx,i-idx);
datas.push_back(s);
idx = i+1;
}
}
TreeNode* root = new TreeNode(stoi(datas[0]));
int index = 1;
queue<TreeNode*> q;
q.push(root);
while(!q.empty()){
TreeNode* node = q.front();q.pop();
if(datas[index]!="null"){
TreeNode* left = new TreeNode(stoi(datas[index]));
node->left = left;
q.push(node->left);
}
index++;
if(datas[index]!="null"){
TreeNode* right = new TreeNode(stoi(datas[index]));
node->right = right;
q.push(node->right);
}
index++;
}
return root;
}
};
// Your Codec object will be instantiated and called as such:
// Codec codec;
// codec.deserialize(codec.serialize(root));
关注公众号:【THU小鱼干杂货铺】
不间断分享大厂算法题解、实习面经、学习资料等