题目描述
请实现两个函数,分别用来序列化和反序列化二叉树
思路一:
选用vector<int> arr作为辅助,最后转为int* 和char* 的数据类型,由于‘#’不方便表示,因此用一个不会出现的数0x23333代替。方法上是使用递归的先序遍历。
代码一:
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
vector<int> arr;
void dfs(TreeNode* p) {
if(!p) arr.push_back(0x23333); //0x23333表示一个NULL,最好是用转义字符‘#’表示
else {
arr.push_back(p->val);
dfs(p->left);
dfs(p->right);
}
}
TreeNode* dfs2(int** str) {
if(**str == 0x23333) {
++*str;
return NULL;
} else {
TreeNode* res = new TreeNode(**str);
++*str;
res->left = dfs2(str);
res->right = dfs2(str);
return res;
}
}
char* Serialize(TreeNode *root) {
arr.clear();
dfs(root);
int* res = new int[arr.size()];
for(unsigned int i = 0; i < arr.size(); ++i) res[i] = arr[i];
return (char*)res;
}
TreeNode* Deserialize(char *str) {
TreeNode* res;
int *p = (int*)str;
res = dfs2(&p);
return res;
}
};
思路二:
与思路一相同,但整个过程不使用辅助数组,直接用指针实现。由于需要让char*向后移动并改变,因此形参值要设定为char**
代码二:
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
char* Serialize(TreeNode *root) {
if(root == NULL) return NULL;
string str;
Serialize(root, str);
char *res = new char[str.size() + 1];
int i;
for(i = 0; i < str.size(); ++i) {
res[i] = str[i];
}
res[i] = '\0';
return res;
}
void Serialize(TreeNode *root, string &str) {
if(root == NULL) {
str += '#';
return;
}
string r = to_string(root->val); //可以是单个字符‘5’,也可能是字符串‘555’
str += r;
str += ','; //用逗号将数字隔开
Serialize(root->left, str);
Serialize(root->right, str);
}
TreeNode* Deserialize(char *str) {
if(str == NULL) return NULL;
TreeNode* res = Deserialize(&str);
return res;
}
TreeNode* Deserialize(char **str) {
//由于递归时,会不断的向后取字符串
//因此,形参必须是char**类型,
//以保证得到递归后指针str指向未被读取的字符
if(**str == '#') {
++(*str);
return NULL;
}
int num = 0;
while(**str != '\0' && **str != ',') {
num = num*10 + ((**str) - '0');
++(*str);
}
TreeNode *root = new TreeNode(num);
if(**str == '\0') {
return root;
} else {
++(*str);
root->left = Deserialize(str);
root->right = Deserialize(str);
return root;
}
}
};