实验四树和二叉树及其应用(I)技术总结.docVIP

实验四树和二叉树及其应用(I)技术总结.doc

  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文档。上传文档
查看更多
PAGE \* MERGEFORMAT13 姓名学号 实验项目树和二叉树及其应用(I)实验内容1.建立二叉树的二叉链表存储结构,实现二叉树的前序、中序、后序递归遍历。 二叉链表存储结构定义参见教材第127页。 遍历算法参见教材第128-129页。 2.编写递归算法,计算二叉树中叶子结点的数目。(题集第42页6.42) 3.编写递归算法,计算二叉树的深度。(题集第43页6.44)算法设计与程序实现:算法分析 本次实验主函数采用顺序结构,主函数调用自己编写的头文件DataStructure_BinaryTree.h中的相关功能函数,完成实验要求。 程序实现: 1、二叉树的遍历:实验分别递归与非递归的方法分别进行了先序、中序、后序和层序遍历。由于先序、中序、后序的递归遍历实现算法非常类似,所以以下的算法具体实现只对递归的先序遍历和层序遍历以及非递归的先序遍历、后序遍历和层序遍历作详细的分析说明。 2、二叉树的基本操作: (1) 求二叉树的深度; (2) 求二叉树中叶子结点的个数; (3) 先序交换二叉树; (4) 查找以指定元素值为的根节点的根子树; (5) 删除以指定元素值为的根节点的根子树; (6) 判断二叉树是否为完全二叉树。 以下分别以上的基本操作算法的具体实现作了详细的分析说明。 1、二叉树的遍历 递归先序遍历:先序遍历二叉树的原则是当二叉树不为空时,先访问根结点,再次先序遍历左子树,最后先序遍历右子树,否则进行空操作(递归结束的条件)。按照以上先序遍历的原则,采取递归的方法很容易完成程序的具体实现。 递归层序遍历:层序遍历顾名思义从根结点出发从左到右逐层进行访问,由此可以通过控制层次数进而进行逐层遍历,当层次数不为零时,层次数递减递归遍历左、右子树,当层次数为零时(递归结束条件),访问该节点。遍历时可不比事先知道二叉树的深度(用于层次数递增边界控制),当当前层次数下访问失败并返回,则当前层次数即为二叉树的深度。以上遍历中对每一层遍历都需从根结点出发。 非递归先序遍历:在根指针不空的情况下,访问根结点,根指针域压栈,继续遍历左子树,循环上诉操作,当左子树指针为空(循环结束条件,同时也是遍历右子树的条件),此时表明根指针已空, 本左子树遍历完毕,然后退栈返回上一层,弹出的指针即此时根结点指针,继续遍历右子树未曾访问的结点。 非递归中序遍历:如同此法,中序与先序的不同是不能首先访问根结点,而是要先访问作孩子节点,要使根结点能够被访问,就要求此时根结点的左孩子为空,这样根结点就能访问了,故访问操作是在根指针退栈后进行访问的。 非递归后序遍历:后序遍历与上面的先序、中序遍历的不同是也访问根结点的条件,即当根结点的右指针域为空或右孩子指针指向的节点已被访问过。由此算法是只要根指针不空时,将根指针进栈,遍历左子树,当根指针为空(根节点的左孩子指针为空,该指针并没有进栈),取出栈顶指针,判断右孩子指针是否为空或已被访问过,如果上述条件成立则访问根结点,退栈并更新用于记录被访问的指针。 非递归层序遍历:根据二叉树的特性,使用队列这种数据结构,出队列一个节点指针,入队列两个节点指针,出队列指针结点的左右孩子指针即为入队列的指针(当访问成功才入队列),通过上述操作即可实现层序遍历。 2、二叉树的基本操作 求二叉树的深度:求二叉树的深度即求得左右子树的深度(左右子树深度最大值)加1,当然求左右子树的深度即求左右子树的左右子树的深度加1,由此递归下去,当子树为空时(递归结束条件),返回0,然后逐层向上其的二叉树深度。 求二叉树中叶子结点的个数:叶子结点即左右子树皆为空的节点。由此选择递归就很容易实现,从根结点开始进行遍历,判断当前结点的左右子树是否为空,不为空则继续访问下一个节点,为空则使叶子结点数加1,继续查找其他的节点。 先序交换二叉树:当根指针不空时,交换左右子树指针,然后交换左子树的左右孩子指针,如此递归操作,当当前的根指针为空时,返回,交换右子树,如此就完成了二叉树的交换。 查找以指定元素值为的根节点的根子树:查找根遍历是相同的,只是把遍历的具体应用函数改为判断访问的节点的数据是否等于指定的数据,当找到则返回当前节点的根指针,若全部访问结束都还没栈顶则返回失败。 删除以指定元素值为的根节点的根子树:查找指定元素的操作可通过上诉函数完成,至此只需要调用删除二叉树函数,至于删除二叉树的算法是当根指针不空时,依次释放左右子树的内存,然后释放根结点,当然释放左右子树时又是先释放左右子树的左右子树的内存,如此进行递归操作,当根指针为空时,返回。 判断二叉树是否为完全二叉树:判断二叉树是否为完全二叉树可以转化为判断二叉树的左右子树的深度是否相等,当相等时,二叉树即为完全二叉树,不等则不是

文档评论(0)

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

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

1亿VIP精品文档

相关文档