二叉树的遍历分析.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
数据结构课程设计 实 验 报 告 题目名称:二叉树的遍历及左右子树的交换 学院: 信息科学与工程学院 一、 问题描述 实现二叉树的中序、前序、后序遍历的递归、非递归遍历算法,层次遍历的非递归遍历算法,应包含建树的实现,其次将其所有结点的左右子树交换。 二、 基本要求 要求:首先要按照一种确定的遍历顺序建立二叉树,然后分别利用递归和非递归算法显示该二叉树的前序、中序、后序遍历,利用非递归算法显示其层次遍历 ,最后交换结点的左右子树,实现所有结点的左右子树交换,并且验证交换结果是否正确。 三、 数据结构的设计 由数据结构中二叉树的定义可知,二叉树的结点由一个数据元素和分别指向其左、右子树的两个分支构成,所以在本程序中二叉树的构造采用二叉链表的链式存储结构,链表中的结点应包含三个域:数据域和左、右孩子的指针域。这种存储结构可以方便二叉树的建立以及遍历。 1、结点的数据结构 struct BiTNode //数据 char data; //左右孩子指针 struct BiTNode *lchild,*rchild; 2、基本操作 int CreateBiTree BiTree T 初始条件:按照结点的先序序列创建二叉树; 操作结果:构造一棵二叉树。 void PreOrder BiTree T 初始条件:二叉树T存在 操作结果:按照前序遍历(递归)方法遍历二叉树 void InOrder BiTree T 初始条件:二叉树T存在 操作结果:按照中序遍历(递归)方法遍历二叉树 void PostOrder BiTree T 初始条件:二叉树T存在 操作结果:按照后序遍历(递归)方法遍历二叉树 void PreOrder2 BiTree T 初始条件:二叉树T存在 操作结果:按照前序遍历(非递归)方法遍历二叉树 void InOrder2 BiTree T 初始条件:二叉树T存在 操作结果:按照中序遍历(非递归)方法遍历二叉树 void PostOrder2 BiTree T 初始条件:二叉树T存在 操作结果:按照后序遍历(非递归)方法遍历二叉树 void LevelOrder BiTree T 初始条件:二叉树T存在 操作结果:按照层次遍历(非递归)方法遍历二叉树 void SwapChild BiTNode **p 初始条件:二叉树T存在 操作结果:将二叉树左右结点交换 四、 软件模块结构图 、 五、 程序流程图 六、 调试分析 运行程序,例如输入如下所示的二叉树。 A B C D E F 时间复杂度分析:很显然,前序.中序.后序递归算法的复杂度是相同的,递归算法非常的简单。例如前序先访问跟节点,然后访问左节点,再访问右节点。仔细看一下递归程序,就会发现,其实每次都是子树的左子树 lchild ,直到左子树为空,然后开始从递归的最深处返回,然后开始恢复递归现场,访问右子树。其实过程很简单:一直往左走?root- lchild- lchild- lchild...- null,由于是先序遍历,因此一遇到节点,便需要立即访问;由于一直走到最左边后,需要逐步返回到父节点访问右节点,时间方面每个节点调用一次函数,访问一次,是O n .没有空间开销,所以是0.中序、后序递归算法同前序一样。时间复杂度是O n ,空间复杂度是0.同理可知中序与后序也是一样的。? 非递归层序遍历有不一样。层序遍历中每次将节点压入队,然后弹出,再让左子树入队,再让右子树入队,在遍历过程中,左右子树依次入队出队。时间复杂度O n ,空间复杂度为0。 问题一:刚开始编创建算法的时候调试总是出错,后来经过参考数据结构相关资料才发现有一个地方少写一行申请空间的代码。 问题二:非递归算法在编程时都是不很顺利,其中层序遍历有点难,需要掌握队列的知识,但是经过我的仔细分析,最终成功的解决了这个问题。? 问题三:要注意输入必要的头文件,否则编译时会出错,有时不知道头文件可以查阅书本。 七、 测试数据 数据测试主要是由截图来说明,编译成功后,按照前序遍历的方法输入子树,空子树用#表示,在本程序中输入的是一个有六个结点的二叉树 见上图),输入ABD##E##CF###,则构成上图所示的二叉树。 输入二叉树后,分别调用前序遍历函数、中序遍历函数、后序遍历函数以及层次遍历函数,在功能实现后调换二叉树所有的左右子树,再分别前序遍历函数、中序遍历函数、后序遍历函数以及层次遍历函数。所有功能都实现后,退出程序。? 程序运行中的截图如下所示: 1 主菜单界面 2 建立一棵有六个结点的二叉树 3 随机遍历二叉树 4 交换左右子树 5 随机遍历二叉树 0 退出程

文档评论(0)

***** + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档