链接:
https://leetcode.com/problems/serialize-and-deserialize-binary-tree/
题目:
自定义二叉树序列化与反序列化协议。
思路:
自定义序列化格式:{root->val:root->left->val,root->right->val}
例如
1
/ \
2 3
/ \
4 5
序列化之后为:{1:2,3}{2:N,N}{3:4,5}{4:N,N}{5:N,N},其中N代表节点为NULL
自定义函数说明:
Int_String(int val) // 整数转字符串
String_Int(string data,int l , int r) //字符串转整数
默认函数:
serialize(TreeNode* root) //序列化二叉树
deserialize(string data) //反序列化二叉树
调用格式:
Codec codec;
codec.deserialize(codec.serialize(root));
代码:
class Codec {
public:
// Encodes a tree to a single string.
string Int_String(int val){
if(val == 0) return "0";
string str = "";
while(val){
char s = (val %10 + '0');
str = s + str;
val = val / 10;
}
return str;
}
string serialize(TreeNode* root) {
string ret = "";
queue<TreeNode *>Q;
Q.push(root);
while(!Q.empty()&&Q.front()){
TreeNode *t = Q.front();
string str = "{";
str = str + Int_String(t->val);
str = str + ':';
if(t->left){
Q.push(t->left);
str = str + Int_String(t->left->val);
}
else {
str = str + 'N';
}
str = str + ',';
if(t->right){
Q.push(t->right);
str = str + Int_String(t->right->val);
}
else {
str = str + 'N';
}
str = str + '}';
ret = ret + str;
Q.pop();
}
return ret;
}
int String_Int(string data,int l , int r){
int val = 0;
while(l<=r){
val = val * 10 + (data[l] - '0');
l++;
}
return val;
}
// Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
int len = data.length();
int i = 0;
TreeNode *root = NULL;
queue<TreeNode*>Q;
Q.push(root);
while(i<len){
i++;
int x = i;
while(data[i+1]!=':') i++;
TreeNode *t = Q.front();
if(!t) {
t = new TreeNode(String_Int(data,x,i));
root = t;
}
i +=2;
if(data[i] != 'N'){
x = i;
while(data[i+1]!=',') i++;
t->left = new TreeNode(String_Int(data,x,i));
Q.push(t->left);
}
i +=2;
if(data[i] != 'N'){
x = i;
while(data[i+1]!='}') i++;
t->right = new TreeNode(String_Int(data,x,i));
Q.push(t->right);
}
i +=2;
Q.pop();
}
return root;
}
};