扩充序列对应的二叉树,二叉树层序序列

  扩充序列对应的二叉树,二叉树层序序列

  请描述并实现两个函数,分别用于序列化和反序列化二叉树。序列化后的字符串不受约束,但可以根据序列化后的字符串重新构造与原始二叉树相同的树。

  二叉树的序列化是指根据某种遍历方法的结果,将二叉树保存为某种格式的字符串,使构建在内存中的二叉树能够长期保存。序列化可以基于遍历方法进行修改,如前序、中序、后序和序列二叉树。序列化的结果是一个字符串,空节点(#)在序列化过程中用某个符号表示。

  二叉树的反序列化是指根据按一定遍历顺序得到的反序列化字符串结果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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • office2010激活密钥大全 怎么永久激活office2010
  • project2010产品密钥免费_project2010激活密钥永久激活码
  • c语言调用退出函数 c语言退出整个程序怎么写
  • c语言中怎么给函数初始化 c语言的初始化语句
  • c语言编写函数计算平均值 c语言求平均函数
  • chatgpt是什么?为什么这么火?
  • ChatGPT为什么注册不了?OpenAI ChatGPT的账号哪里可以注册?
  • OpenAI ChatGPT怎么注册账号?ChatGPT账号注册教程
  • chatgpt什么意思,什么是ChatGPT ?
  • CAD中怎么复制图形标注尺寸不变,CAD中怎么复制图形线性不变
  • cad中怎么创建并使用脚本文件,cad怎么运行脚本
  • cad中快速计算器的功能,cad怎么快速计算
  • cad中快速修改单位的方法有哪些,cad中快速修改单位的方法是
  • cad中心点画椭圆怎么做,cad轴测图怎么画椭圆
  • CAD中常用的快捷键,cad各种快捷键的用法
  • 留言与评论(共有 条评论)
       
    验证码: