题意:
请实现两个函数,分别用来序列化和反序列化二叉树。
实例:
你可以将以下二叉树:
1
/ \
2 3
/ \
4 5
序列化为 "[1,2,3,null,null,4,5]"
数据范围:
题目没说.
解法:
观察样例,发现序列化时按照层序遍历来的,因此序列话的时候bfs就行了.
反序列化的时候也bfs建树即可.
这题的字符串和数字相互转换需要用到to_string(int)和stoi(string).
code:
class Codec {
public:
string serialize(TreeNode* root) {
queue<TreeNode*>q;
q.push(root);
vector<string>temp;
while(q.size()){
TreeNode* x=q.front();q.pop();
if(!x){
temp.push_back("null");
}else{
temp.push_back(to_string(x->val));
q.push(x->left);
q.push(x->right);
}
}
string ans=temp[0];
for(int i=1;i<(int)temp.size();i++){
ans+=",";
ans+=temp[i];
}
return ans;
}
TreeNode* deserialize(string s) {
vector<string>temp;
string x;
for(auto i:s){
if(i==','){
temp.push_back(x);
x="";
}else{
x+=i;
}
}
temp.push_back(x);
if(temp[0]=="null")return NULL;
TreeNode* root=new TreeNode(stoi(temp[0]));
queue<TreeNode*>q;
q.push(root);
int cur=1;
while(q.size()){
TreeNode* x=q.front();q.pop();
string t;
if(cur<(int)temp.size())t=temp[cur++];
else t="null";
if(t=="null"){
x->left=NULL;
}else{
x->left=new TreeNode(stoi(t));
q.push(x->left);
}
if(cur<(int)temp.size())t=temp[cur++];
else t="null";
if(t=="null"){
x->right=NULL;
}else{
x->right=new TreeNode(stoi(t));
q.push(x->right);
}
}
return root;
}
};