题目描述:请实现两个函数,分别用来序列化和反序列化二叉树。
分析:
序列化:也叫持久化,显然序列化需要将每个结点按照一定的顺序转换为字符串即可;
反序列化:根据一个字符串重新建立一棵二叉树,反序列化是序列化的逆过程,对于一个字符串,首先按照分隔符',',将其分割为字符串数组,每个字符串元素代表一个结点,然后开始重建二叉树。由于每个结点再字符串中只保留了一个val值,因此需要根据结点的值val重新构建TreeNode结点对象,并且为这个结点对象的left和right进行赋值。
完整代码:
此代码参考了一些大佬的思路,非常感谢!
/*
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 == nullptr)
return NULL;
//声明一个字符串用来存放节点元素的值
string str;
//用字符串来序列化二叉树
serialize(root, str);
//声明一个字符数组
char *array = new char[str.length() + 1];
//定义一个数组游标i
int i;
//将输出里面的元素转换成字符容器里
for(i = 0; i < str.length(); i++)
{
array[i] = str[i];
}
//在array的结尾头添加'\0'结束符
array[i] = '\0';
//返回字符指针
return array;
}
//反序列二叉树
TreeNode* Deserialize(char *str) {
//检查输入的合法性
if(str == nullptr)
return NULL;
//声明一个节点指针
TreeNode* pNodes = deserialize(&str);
//返回节点指针
return pNodes;
}
private:
void serialize(TreeNode *root, string &str)
{
//判断当前的节点是否为空
if(root == nullptr)
{
//则用$,来代替节点的值
str += '$';
return ;
}
//如果当前的节点的不为空
//将当前的节点的val转换成字符串形式
string r = to_string(root->val);
//向字符串str中添加节点val的字符串形式
str += r;
str += ',';
//将左右子树序列化
serialize(root->left, str);
serialize(root->right,str);
}
TreeNode* deserialize(char **str)
{
//判断当前元素对应的节点是否为空
if(**str == '$')
{
++(*str);
return NULL;
}
//将字符串的字符转换成整数
int number = 0;
while(**str != '\0' && **str != ',')
{
number = number * 10 + ((**str) - '0');
++(*str);
}
//声明结构体指针,并分配内存
TreeNode *pRoot = new TreeNode(number);
//判断数组是否为空
if(**str == '\0')
return pRoot;
else
//遍历数组
(*str)++;
//反序列化二叉树
pRoot->left = deserialize(str);
pRoot->right = deserialize(str);
//返回根节点
return pRoot;
}
};