【剑指Offer-分解让复杂问题简单化】面试题37:序列化二叉树
题目描述
请实现两个函数,分别用来序列化和反序列化二叉树
二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。
二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。
思路
可以使用先序中序(或中序后序)来保存一棵二叉树,但这种方法要求二叉树中没有重复的元素。事实上,将二叉树按先序序列保存,然后再根结点、左子树、右子树来重建即可。代码如下:
/*
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 nullptr;
string str;
SerializeCore(root, str);
char* ans = new char[str.length()+1];
for(int i=0; i<str.length(); i++)
ans[i] = str[i];
ans[str.length()+1] = '\0';
return ans;
}
void SerializeCore(TreeNode* root, string& str){
if(root==nullptr){
str+='#';
str+=',';
return;
}
str+=to_string(root->val);
str+=',';
SerializeCore(root->left, str);
SerializeCore(root->right, str);
}
TreeNode* Deserialize(char *str) {
if(str==nullptr)
return nullptr;
TreeNode* root = DeserializeCore(&str);
return root;
}
TreeNode* DeserializeCore(char** str){ //因为递归过程中要在序列上移动,所以使用二级指针
if(**str=='#'){
(*str)+=2; //注意这里是+2
return nullptr;
}
int val = 0;
while(**str!=','&&**str!='\0'){
val = val*10+((**str)-'0');
(*str)++;
}
TreeNode* root = new TreeNode(val);
if(**str=='\0')
return root;
else (*str)++;
root->left = DeserializeCore(str);
root->right = DeserializeCore(str);
return root;
}
};