剑指offer题型分类及各题的解题思路与代码(<---点我跳转 ^ - ^)
1、题目描述
请实现两个函数,分别用来序列化和反序列化二叉树。
二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。
二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。
2、思路
1. 对于序列化:使用前序遍历,递归的将二叉树的值转化为字符,并且在每次二叉树的结点不为空时,在转化val所得的字符之后添加一个' , '作为分割。对于空节点则以 '#' 代替。
2. 对于反序列化:按照前序顺序,递归的使用字符串中的字符创建一个二叉树(特别注意:在递归时,递归函数的参数一定要是char ** ,这样才能保证每次递归后指向字符串的指针会随着递归的进行而移动!!!)
3、C++实现代码如下
class Solution
{
public:
char* Serialize(TreeNode *root)
{
if (!root)
return "#";
string res = to_string(root->val);
res.push_back(',');
char* left = Serialize(root->left);
char* right = Serialize(root->right);
char* ret = new char[strlen(left)+strlen(right)+res.size()];
strcpy(ret,res.c_str());
strcat(ret,left);
strcat(ret,right);
return ret;
}
//解码,将字符转换成整数,
TreeNode* decode(char* &str)
{
if (*str=='#')
{
++str;
return NULL;
}
int num =0;
//将字符转换成整数
while(*str!=',')
num = num*10+(*(str++)-'0');
//指向下一个字符
str++;
//为结点开辟空间
TreeNode* res = new TreeNode(num);
//左子树递归解码
res->left = decode(str);
//右子树递归解码
res->right = decode(str);
return res;
}
TreeNode* Deserialize(char *str)
{
return decode(str);
}
};