题目描述
请实现两个函数,分别用来序列化和反序列化二叉树
二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。
二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。
例如,我们可以把一个只有根节点为1的二叉树序列化为"1,",然后通过自己的函数来解析回这个二叉树
解题思路
本题的解题思路倒是很简单,可以按照先序或者层次遍历的方式先将二叉树转化为字符串序列,然后我们便可以知道二叉树的每个结点(实体结点或空结点),进而构建二叉树。
有几个地方需要注意:
- 每个整数之间要用
,
隔开,注意是整数,不是一个0~9
之间的数,因此需要涉及到数字与字符串转化的处理 - 同样,将字符串转为数字的时候也需要进行相应的处理
- 构建二叉树的过程,一般是递归构建,需要处理
,
,遇到#
则为空指针
代码实现
/*
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) {
vector <char> arr;
if(!root) return "#";
ser_help(root,arr);
char *res=new char[arr.size()];
for(int i=0;i<arr.size();i++)res[i]=arr[i];
res[arr.size()]='\0';
return res;
}
void ser_help(TreeNode *root,vector <char> &arr){
if(!root){
arr.push_back('#'),arr.push_back(',');
return;
}else
int2string(root->val,arr);
ser_help(root->left,arr);
ser_help(root->right,arr);
}
void int2string(int num,vector <char> &arr){
vector <char> tmp;
while(num){
tmp.push_back(num%10+'0');
num=num/10;
}
while(!tmp.empty()){
arr.push_back(tmp.back());
tmp.pop_back();
}
arr.push_back(',');
}
TreeNode* Deserialize(char *str) {
return construct(str);
}
TreeNode *construct(char *&str){
if(*str==',')str++;
if(*str=='#'){
++str;
return NULL;
}
int num=0;
while(*str!=','){
num=num*10+(*str-'0');
++str;
}
++str;
TreeNode *root=new TreeNode(num);
root->left=construct(str);
root->right=construct(str);
return root;
}
};
运行时间:3ms
占用内存:380k