扩充序列对应的二叉树,二叉树层序序列
请描述并实现两个函数,分别用于序列化和反序列化二叉树。序列化后的字符串不受约束,但可以根据序列化后的字符串重新构造与原始二叉树相同的树。
二叉树的序列化是指根据某种遍历方法的结果,将二叉树保存为某种格式的字符串,使构建在内存中的二叉树能够长期保存。序列化可以基于遍历方法进行修改,如前序、中序、后序和序列二叉树。序列化的结果是一个字符串,空节点(#)在序列化过程中用某个符号表示。
二叉树的反序列化是指根据按一定遍历顺序得到的反序列化字符串结果str来重建二叉树。
比如可以按照顺序遍历方案进行序列化,如下图所示:顺序序列化(即使用serialize函数将上面的二叉树转化为“{1,2,3,#,#,6,7}”,然后可以调用Deserialize将“{1,2,3,#,#,6,7}”构造成
当然,也可以按照满二叉树节点位置的标号规律进行序列化,也可以按照一阶遍历和中阶遍历的结果进行序列化。对连载串没有任何约束,欢迎各种奇思妙想。
数据范围:节点数,树中每个节点的值满足要求:序列化和反序列化都是空间复杂度和时间复杂度。
示例1输入:
{1,2,3,#,#,6,7}复制返回值:
{1,2,3,#,#,6,7}复制说明:
如主题地图示例2所示:
{8,6,10,5,7,9,11}复制返回值:
{8,6,10,5,7,9,11}
解决方案1:使用层次遍历存储完整二叉树;
用一个数组存储输入二叉树的层次遍历,将二叉树完成到叶子节点子节点级别的完整二叉树。代码如下:
//https://www . now coder . com/practice/cf 7 e 25 aa 97 c 04 C1 a 68 c 8 f 040 e 71 FB 84?tpId=295 tags=title=难度=0判断状态=0 rp=0来源URL=/考试/oj
#包含位/标准数据。h
定义树结构
{
int val
struct TreeNode * left
struct TreeNode * right
TreeNode(int x) : val(x),left(nullptr),right(nullptr) {}
};
char *Serialize(TreeNode *root)
{
if (root==nullptr)
{
返回nullptr
}
STD:vector STD:vector TreeNode * v;//存储层次遍历的结果
STD:queue TreeNode * q;//分层遍历辅助队列
q.push(根);
而(!q.empty())
{
int n=q . size();
STD:vector TreeNode * level;
int null _ count=0;//记录当前层的空节点数。如果所有节点都是空的,结束遍历。
int I=0;
当(名词)
{
自动节点=q . front();
q . pop();
level.push_back(节点);
如果(节点!=nullptr)
{
q.push(节点向左);
q.push(节点右移);
}
Else//如果当前节点为空,则将其左右节点填充为空节点,这样数组就可以形式化地表示为一棵完整的二叉树。
{
q . push(nullptr);
q . push(nullptr);
null _ count
}
}
if (null_count=n)
{
打破;
}
v.push_back(级别);
}
std:字符串数据;
for(int I=0;I v . size();我)
{
for(int k=0;k v[i]。size();k)
{
自动节点=v[I][k];
if (node==nullptr)
{
data.append(1, # );
}
其他
{
data=STD:to _ string(node-val);
}
data.append(1,,);
}
}
char * str=new char[data . size()1];
strncpy(str,data.data(),data . size());
str[data . size()]= \ 0 ;
返回字符串;
}
TreeNode *反序列化(char *str)
{
if (str==nullptr)
{
返回nullptr
}
TreeNode * root=nullptr
int I=0;
STD:vector TreeNode * v;
while (str[i]!=\0)//从字符串还原到数组
{
TreeNode * node=nullptr
if (str[i]==# )
{
v . push _ back(nullptr);
I=2;
}
其他
{
int n=0;
while (str[i]!=,)
{
n=n * 10(str[I]- 0 );
我;
}
v . push _ back(new TreeNode(n));
我;
}
}
for(int I=0;I v . size()/2;I)//因为是完全二叉树,所以只需要按照下标连接当前节点及其左右节点即可。
{
if (v[i]!=nullptr)
{
v[I]-left=v[I * 2 ^ 1];
v[I]-right=v[I * 2 ^ 2];
}
}
return v[0];
}
其他解决方案指的是Niuke.com的实现.
使用一阶遍历的实现和使用层次遍历的实现来自,
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。