当前位置: 首页 > wzjs >正文

北京建站优化公司互联网企业排名2021

北京建站优化公司,互联网企业排名2021,做报告的网站,公司网站海报怎么做C语言实现树和森林的遍历 导读一、树的遍历二、森林的遍历2.1 为什么森林没有后序遍历?2.2 森林中存不存在层序遍历?三、C语言实现3.1 准备工作3.2 数据结构的选择3.3 树与森林的创建3.4 树与森林的遍历3.4.1 先根遍历3.4.2 后根遍历3.4.3 森林的遍历3.5 树与森林的销毁3.6 算…

C语言实现树和森林的遍历

  • 导读
  • 一、树的遍历
  • 二、森林的遍历
    • 2.1 为什么森林没有后序遍历?
    • 2.2 森林中存不存在层序遍历?
  • 三、C语言实现
    • 3.1 准备工作
    • 3.2 数据结构的选择
    • 3.3 树与森林的创建
    • 3.4 树与森林的遍历
      • 3.4.1 先根遍历
      • 3.4.2 后根遍历
      • 3.4.3 森林的遍历
    • 3.5 树与森林的销毁
    • 3.6 算法测试
  • 四、树、森林与二叉树遍历的对应关系
  • 结语

C语言实现树和森林的遍历

导读

大家好,很高兴又和大家见面啦!!!

在上一篇内容中我们介绍了树、森林与二叉树之间的相互转换,其核心逻辑就是通过孩子兄弟存储结构对树、森林进行存储,完成存储后的树和森林就被转换成了一棵二叉树。

说到二叉树,那我们就不能介绍一下遍历操作了。在二叉树中我们可以进行四中遍历:

  • 先序遍历:按根->左->右的方式进行遍历
  • 中序遍历:按左->根->右的方式进行遍历
  • 后序遍历:按左->右->根的方式进行遍历
  • 层序遍历:按从上到下,从左到右的方式进行遍历

在树和森林中,并没有像二叉树一样有这么多的遍历方式。我们以中序遍历为例:

  • 在二叉树中结点是标准的左子树、根结点、右子树的形态,因此我们可以按照左->根->右的形式完成遍历;
  • 在树中,每个结点的孩子结点不一定是2个孩子,可能会出现多个孩子的情况,此时我们无法准确的划分左->根->右三部分;

树与二叉树的区别
如上图所示,当一棵树的度大于2时,我们只能够划分根结点与孩子结点,并不能划分左子树与右子树。因此在树中不存在中序遍历。

那么树与森林我们应该如何实现遍历操作呢?在今天的内容中,我们将详细探讨树与森林的遍历操作,并通过C语言实现树与森林的遍历;

一、树的遍历

遍历也就是访问树中的所有结点,完成访问后,我们会得到一个对应的遍历序列。在同一棵树中,根据遍历方式的不同,我们会得到不同的遍历序列。

在树中常见的有两种遍历方式:

  • 先根遍历
    • 先访问根结点
    • 再依次访问根结点的每一棵子树
    • 遍历子树时,同样按照先根后子树的规则进行访问
  • 后根遍历
    • 先访问根结点的每一棵子树
    • 再访问根结点
    • 遍历子树时,同样按照先子树后根的规则进行访问

另外,树和二叉树也可以进行层序遍历,遍历的规则依旧是从上到下,从左到右。

树的遍历
在树的遍历中,整个遍历的过程与二叉树一致,唯一不同的就是孩子结点的数量:

  • 在二叉树中,孩子结点的数量不会超过2个
  • 在树中,孩子结点的数量则不可控,根据结点的度不同,孩子的数量也不相同

但是整个遍历的过程中,遍历的顺序一定是从左往右进行遍历。

二、森林的遍历

在森林中,可能会同时存在多棵非空树,如果我们以结点为分界线来将森林进行划分,我们就会得到3部分:

  • 左侧的子树
  • 根结点
  • 右侧的其他树组成的森林

因此,在森林中我们的遍历方式有两种方式:

  • 先序遍历:
    • 先访问根结点
    • 再访问当前根结点的子树
    • 最后访问右侧森林
  • 中序遍历:
    • 先访问当前根结点的子树
    • 再访问根结点
    • 最后访问右侧森林

森林的遍历

此时有朋友可能会奇怪,为什么我们可以将森林分为三个部分,但是我们无法进行后序遍历呢?在森林中可不可以进行层序遍历呢?

下面我们就来对这两个问题进行探讨;

2.1 为什么森林没有后序遍历?

前面我们对森林的划分,虽然我们将其分为了3部分,但是实际上我们是将森林划分成了两部分:

  • 一棵树
  • 其他树组成的森林

并且森林的两种遍历方式的底层逻辑也是如此:

  • 先完成一棵树的遍历
  • 再遍历森林中的其它树
  • 直到完成森林中所有树的遍历

在二叉树中,之所以能够实现后序遍历,这是因为左右子树与根结点之间是有一定的关联的。

但是在森林中,其他树组成的森林与当前遍历的树的根结点之间并无任何联系,因此我们无法通过当前的结点找到其它树的结点,同时我们也无法从其他树的结点找到当前树的根结点。

正是因为森林中的树互不相交这个特性,所以我们无法完成对森林的后序遍历。

2.2 森林中存不存在层序遍历?

在二叉树中,层序遍历是借助队列实现的,而我们在进行入队操作时,是根据结点之间的联系完成的入队操作;

而在森林中,各棵树之间并无联系,因此当我们在执行入队操作时,无法从一棵树的结点找到另一棵树的结点,也就无法在对当前的树进行遍历时去遍历其他的树,所以在森林中无法实现层序遍历。

树与森林的遍历逻辑我们就介绍完了,接下来我们就尝试着通过C语言来实现一棵树与森林的遍历;

三、C语言实现

3.1 准备工作

在开始编写C语言代码之前,我们还是先要完成最基本的准备工作:

  • 打开编辑器:我使用的是VS2019
  • 创建空项目
  • 创建头文件与源文件

这里我选择创建3个文件——树与森林的头文件、树与森林遍历实现的源文件以及测试源文件,文件的命名就根据自己的喜好了,我这里是用于博客,所以我的文件命名为:"blog.h""blog.c""test.c"

完成文件创建后,就是头文件的引用了。实现树与森林的遍历,我们需要实现至少4个功能:

  • 树与森林的创建
  • 树与森林的遍历
  • 树与森林的销毁
  • 树与森林的打印

这里我们还是采用的动态函数来实现树与森林的内存管理,因此需要引用动态函数头文件:<stdlib.h>以及断言头文件<assert.h>

要完成正常的输入输出,那我们肯定需要引入标准输入输出的头文件:<stdio.h>

准备工作
完成了初步的准备工作后,接下来我们就需要一步一步的进行算法的实现了;

3.2 数据结构的选择

今天我们会实现如下图所示的树与森林遍历:
树与森林转化二叉树

在前面的介绍中,我们介绍了3种树与森林的存储结构。其中我们经常使用的是与孩子兄弟表示法相同的二叉链表,因此在今天的实现中,我们会通过孩子兄弟表示法的方式实现上图所示的树与森林:

typedef char ElemType;
//孩子兄弟表示法
typedef struct ChildBrotherNode {ElemType data;//数据域struct ChildBrotherNode* lchild;//左孩子struct ChildBrotherNode* rbrother;//右兄弟
}CBNode, * CBTree;
//CBNode——孩子兄弟结点
//CBTree——孩子兄弟树
typedef struct ChildBrotherForest {CBTree* trees;//森林中的树int n;//树的个数
}CBForest;
//CBForest——孩子兄弟森林

为了区分树与森林,这里我将森林单独分离出来,通过线性表来记录森林中的树,这个与上一篇中的森林的孩子兄弟表示法的介绍有些区别,希望大家能够理解,如果和什么疑问可以评论区留言。

3.3 树与森林的创建

通过孩子兄弟表示法实现的是树与森林转换后的一棵二叉树,而二叉树的创建过程,我们依旧通过先序遍历的方式创建,其对应的二叉树先序序列如下所示:

//树
[A,B,E,0,0,C,F,0,G,0,0,D,H,0,I,0,J,0,0,0,0]
//森林
[[A,0,0],[B,E,0,0,0],[C,F,0,G,0,0,0],[D,H,0,I,0,J,0,0,0]]

创建的先序递归算法如下所示:


文章转载自:

http://JVaeP1Ou.dbhnx.cn
http://zJjPhmOJ.dbhnx.cn
http://chQMEkjQ.dbhnx.cn
http://y58Ijr9g.dbhnx.cn
http://6NQEO8FP.dbhnx.cn
http://KStUVpOu.dbhnx.cn
http://4M8xftfz.dbhnx.cn
http://JrGf7IfR.dbhnx.cn
http://00PWTUAb.dbhnx.cn
http://uQnpM6Yv.dbhnx.cn
http://1RZpjmfy.dbhnx.cn
http://QxumpME4.dbhnx.cn
http://76tzijJI.dbhnx.cn
http://hytZOT3p.dbhnx.cn
http://a4FsKUbq.dbhnx.cn
http://X3ErRyjo.dbhnx.cn
http://fSGTOYlM.dbhnx.cn
http://zGsDzkYm.dbhnx.cn
http://a8U5bW29.dbhnx.cn
http://l7NPVIC4.dbhnx.cn
http://rMMdrgOc.dbhnx.cn
http://PoevKFOR.dbhnx.cn
http://XXh0urSF.dbhnx.cn
http://4jhE9sxl.dbhnx.cn
http://d9k2lsnh.dbhnx.cn
http://vQCziLwo.dbhnx.cn
http://r1JXewJL.dbhnx.cn
http://9pgOOOlR.dbhnx.cn
http://zkrNciX8.dbhnx.cn
http://Zg1eeWNd.dbhnx.cn
http://www.dtcms.com/wzjs/688187.html

相关文章:

  • 使页面具有动态效果的网站建设技术是外贸平台收费标准
  • 建设个人网站的好处佛山seo优化评价
  • 网站建设推广行业wordpress关闭手机版
  • 河北建设厅网站查询网站设计怎么做一点首页就跳转
  • 开发php网站建设秋莱网站建设
  • 有哪些做平面设计好的网站有哪些可以做视频的网站
  • 班级网站主页怎么做做网站怎么电话约客户
  • 公司网站需要程序员做吗西宁服务
  • 网站开发设计步骤网络推手公司怎么收费
  • 毕业设计可以做自己的网站吗护肤品网站建设前的行业分析
  • 手机微信客户端网站建设临邑网页设计
  • 怎样把已经有的网站做推广一种子网站做的很好的视频广告
  • 商标设计在线生成器西安网站优化效果
  • 网站开发怎么报价建设网站包维护
  • 专注徐州网站开发书签制作方法图片大全
  • 网站建设首先要网站验证码目录
  • 新泰网站设计软件项目管理案例分析
  • 重庆网站建设安全营销型网站模版
  • 网站建设与维护大学生总结新网站怎么做seo
  • 北京外包公司 网站开发2013深圳网站设计公司排名
  • 郑州网站建设哪家便宜中山百度推广公司
  • 济南手机网站建设公司排名单页网站的营销
  • 广西壮族自治区市场监督管理局官网网站推广优化招聘
  • 在线视频网站开发方案php施工企业安全生产评价汇总表最终须由( )签名。
  • 综合门户型网站有哪些凉山州建设局网站
  • win2008 iis网站发布为什么备案关闭网站
  • 网站所有者查询网站流量怎么做乡1万
  • hao123网站模板长沙网站制作与设计
  • 中英文切换网站怎么做企业网站建设营销优化方案
  • 长沙优化网站技术厂家360浏览器建设银行网站