难度:中等
题目
请实现两个函数,分别用来序列化和反序列化二叉树。
示例:
你可以将以下二叉树:
1
/ \
2 3
/ \
4 5
序列化为 "[1,2,3,null,null,4,5]"
解答
思路
层序遍历,使用一个队列辅助
知识点
queue 的 push pop front
to_string
复杂度 | O |
---|---|
时间复杂度 | O(n) |
空间复杂度 | O(n) |
代码
/**
* 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) {
if(!root) return "";
// 层序遍历
string ret;
string saveNull;
queue<TreeNode*> saveNode;
saveNode.push(root);
while(!saveNode.empty()){
if(!saveNode.front()){
saveNode.pop();
saveNull+="$";
saveNull+=",";
}
else{
saveNode.push(saveNode.front()->left);
saveNode.push(saveNode.front()->right);
ret+=saveNull;
saveNull="";
ret+=to_string(saveNode.front()->val);
saveNode.pop();
ret+=",";
}
}
return ret;
}
// Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
queue<TreeNode*> saveNode;
if(data.empty()) return nullptr;
int temp=0;
bool isHead=true;
TreeNode* head;
bool isPositive=true;
int position=0;//0 代表左边 1代表右边
for(int i=0;i<data.size();i++){
if(data[i]=='$'){
position++;
i++;
}
else if(data[i]=='-'){
isPositive=false;
}
else if(data[i]=='+'){
isPositive=true;
}
else if(data[i]>='0'&&data[i]<='9'){
temp=temp*10+data[i]-'0';
}
else{
if(isHead){
isHead=false;
head=isPositive?new TreeNode(temp):new TreeNode(-temp);
saveNode.push(head);
}
else{
TreeNode* tempNode=isPositive?new TreeNode(temp):new TreeNode(-temp);
saveNode.push(tempNode);
if(position==0){
saveNode.front()->left=tempNode;
}
else{
saveNode.front()->right=tempNode;
}
position++;
}
temp=0;
isPositive=true;
}
if(position==2){
position=0;
saveNode.pop();
}
}
return head;
}
};
// Your Codec object will be instantiated and called as such:
// Codec codec;
// codec.deserialize(codec.serialize(root));