题目描述
请实现两个函数,分别用来序列化和反序列化二叉树
二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。
二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。
**思路:添加一个辅助数组来存储序列化后的数字
首先,序列化,将数组clear,然后判断直接进入遍历环节,如果当前节点wei空,就压入0xffffffff,然后返回,如果不为空,就压入数组,然后遍历左节点,再右节点。遍历完后,需要通过一个缓存的方式返回res数组,因为函数返回类型是char的,所以我们线用int的将辅助数组的元素压入局部变量数组,然后返回时强制转换为char
其次,反序列化:
反序列化就是将字符串char的转换成TreeNode的首节点的。因为我们反序列化是通过判断数值大小来进行构造树的,所以我们通过先转换成int, 调用反序列化函数。dsf2,使用的是引用传参,先判断为0xFFFFFFFF吗,若是,p++,然后返回空, 否则通过当前节点new一个节点,做成根节点。然后连接并构造左右节点!(都是用p)原因是在构造完后,会有p++;接着才是构造。
/*
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) {
buf.clear(); //陈清数组。
def1(proot); //前序遍历
int bufsize=buf.size();
int *res=new int[bufsize];
for(int i=0;i<bufsize;i++)
res[i]=buf[i]; //因为buf里面是int
return (char*)res; //注意接口的类型对齐
}
//反序列化
TreeNode* Deserialize(char *str) {
int *p=(int *)str;
return dsf2(p);
}
private:
vector<int> buf;
void dsf1(TreeNode* p)
{
if(!p)
buf.push_back(0xFFFFFFFF);
else
{
buf.push_back(p->val);
dsf1(p->left);
dsf1(p->right);
}
return ;
}
void dsf2(int * &p)
{
if(*p==0xFFFFFFFF) //说明为空
{
p++;
return nullptr;
}
TreeNode* res=new TreeNode( *p); //首节点!
p++; //提前加了,为了后面的左右节点坐准备
res->left=dsf2(p); //加过的左节点。
res->right=dsf2(p); //所以才需要是引用!
return res;
}
};