题目:
请实现两个函数,分别用来序列化和反序列化二叉树。
1.解题思路:
根据前序遍历的顺序来序列化和反序列化二叉树。在遍历二叉树碰到NULL指针时,可以用$符号表示,节点之间可以用逗号隔开。
2.代码:
/*
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) return "$"; //异常输入
string r = to_string(root->val); //将数值转化为字符串。返回对应的字符串。
r.push_back(','); //将元素加入到容器的最后一位。
char *left = Serialize(root->left);
char *right = Serialize(root->right);
//char是字符类型, string是字符串类型
//size()返回字符串大小, strlen(str)是用于求字符数组的长度,其参数是char*
char *ret = new char[strlen(left) + strlen(right) + r.size()];
//strcpy()用于字符串复制,strcpy(a,b)是将b指向的字符串复制到a指向的空间中
//c_str()函数返回一个指向正规C字符串的指针, 内容与本string串相同.
strcpy(ret, r.c_str());
strcat(ret, left);//将两个char类型链接。
strcat(ret, right);
return ret;
}
TreeNode* Deserialize(char *str){
return decode(str);
}
//在c++中,当申明变量int *p 的时,表示p是一个储存地址的变量;比如int *p=0,表示p指向地址
//为00000000的地址单元。当申明指针p之后,再用*p表示p指向的储存空间的内容;&表示取变量的地址;
TreeNode* decode(char *&str){ //*&指针引用,指针引用*&可以替代二级指针**
if(*str == '$'){
str++;
return NULL;
}
int num = 0;
while(*str != ',')
num = num*10 + (*(str++)-'0');
str++;
TreeNode *root = new TreeNode(num);
root->left = decode(str);
root->right = decode(str);
return root;
}
};