二叉树的遍历详解.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数据结构课程设计 实 验 报 告 题目名称:二叉树的遍历及左右子树的交换 学院: 信息科学与工程学院 一、 问题描述 实现二叉树的中序、前序、后序遍历的递归、非递归遍历算法,层次遍历的非递归遍历算法,应包含建树的实现,其次将其所有结点的左右子树交换。 二、 基本要求 要求:首先要按照一种确定的遍历顺序建立二叉树,然后分别利用递归和非递归算法显示该二叉树的前序、中序、后序遍历,利用非递归算法显示其层次遍历 ,最后交换结点的左右子树,实现所有结点的左右子树交换,并且验证交换结果是否正确。 三、 数据结构的设计 由数据结构中二叉树的定义可知,二叉树的结点由一个数据元素和分别指向其左、右子树的两个分支构成,所以在本程序中二叉树的构造采用二叉链表的链式存储结构,链表中的结点应包含三个域:数据域和左、右孩子的指针域。这种存储结构可以方便二叉树的建立以及遍历。 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。 ? 问题一:刚开始编创建算法的时候调试总是出错,后来经过参考数据结构相关资料才发现有一个地方少写一行申请空间的代码。? 问题二:非递归算法在编程时都是不很顺利,其中层序遍历有点难,需要掌握队列的知识,但是经过我的仔细分析,最终

文档评论(0)

335415 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档