数据结构课件:二叉树的遍历和应用.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《数据结构课件:二叉树的遍历和应用.ppt》由用户(罗嗣辉)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课件 二叉 遍历 应用
- 资源描述:
-
1、二叉树的遍历和应用二叉树的遍历和应用数据结构与算法1预备知识递归2什么是递归? 递归是极强大的问题解决技术。递归是极强大的问题解决技术。 当一个函数用它自己来定义时就是递归。当一个函数用它自己来定义时就是递归。 递归将一个复杂问题分解为一些更小的递归将一个复杂问题分解为一些更小的问题。问题。 3举例:查词典 顺序查找:可以从词典第一页开始,按顺序查找:可以从词典第一页开始,按顺序查找每个单词,直到找到。顺序查找每个单词,直到找到。 递归解决方案递归解决方案 :分而治之的策略;把问:分而治之的策略;把问题划分成小问题,直到到达基例。题划分成小问题,直到到达基例。查找词典查找词典的前半部分查找词典
2、的后半部分4递归解决方案的一般形式 怎样按同类型的更小的问题来定义问题怎样按同类型的更小的问题来定义问题 各个递归调用怎么减小问题规模各个递归调用怎么减小问题规模 哪个问题实例可用做基例哪个问题实例可用做基例 随着问题规模的减小,最终能否到达基例随着问题规模的减小,最终能否到达基例 5举例1:n的阶乘public static int fact(int n)/compute the factorial of a nonnegative integer/precondition:n must be greater than or equal to 0/postcondition:returns
3、the factorial of n/-if (n = 0) return 1;Else return n*fact(n-1); /end if/end fact6举例2:逆置字符串减小规模:去掉最后一个字符writeBackward(s)if (the string s is empty) do nothing this is the base caseElse Write the last character of swriteBackward(s minus its last character) /end if/end 减小规模:去掉第一个字符writeBackward2(s)if (
4、the string s is empty) do nothing this is the base caseElse writeBackward2(s minus its first character) Write the first character of s /end if/end 7举例3:Hanoi塔solveTowers(count,source,destination,spare)if (count is 1) Move a disk directly from source to destination;Else sloveTowers(count-1,source,spa
5、re,destination)sloveTowers(1,source ,destination,spare)sloveTowers(count-1,spare,destination,source) /end if/end8举例4:兔子繁殖(递归法)public static int rabbit(int n)if (n 29举例4:兔子繁殖(迭代法)public static int iterativeRabbit(int n)/iterative solution to the rabbit problem/initialize base cases: int previous = 1;
6、 /rabbit(1) int current = 1; /rabbit(2) int next = 1; /result when n is 1 or 2 /computer next rabbit values when n = 3 for (int i = 3;i = n; i+) next = current + previous;previous = current;current = next; /end forreturn next;/end10二叉树的遍历11一、问题的提出一、问题的提出二、遍历算法二、遍历算法三、算法的递归描述三、算法的递归描述四四、遍历算法的应用举例遍历算法
7、的应用举例12 顺着某一条搜索路径巡访巡访二叉树中的结点,使得每个结点均被访问一均被访问一次次,而且仅被访问一次仅被访问一次。问题的提出“访问访问”的含义可以很广,如:输出结点的信息等。13 “遍历遍历”是任何类型均有的操作,对线性结构而言,只有一条搜索路径(因为每个结点均只有一个后继),故不需要另加讨论。而二叉树是非线性结构, 每个结点有两个后继每个结点有两个后继,则存在如何遍历存在如何遍历即按什么样的搜索搜索路径路径遍历的问题。14层次遍历1. 首先首先创建一个队列创建一个队列;若二叉树非空,;若二叉树非空,将根将根放入队列放入队列;2. 从队列取出一个元素并访问从队列取出一个元素并访问,
8、如果该元素如果该元素有有左孩子左孩子就将它放入队列就将它放入队列,如果该元素有如果该元素有右孩子右孩子就将它放入队列就将它放入队列;3. 若队列非空,继续第若队列非空,继续第2步,直至队列为空,步,直至队列为空,则二叉树的层次遍历过程结束。则二叉树的层次遍历过程结束。例如, 图5.1中的二叉树按照层次遍历的结果为: A B C D E F G H I15前序周游前序周游(preorder traversal) 若二叉树非空, 则依次进行如下操作: (1) 访问根结点; (2) 前序周游左子树; (3) 前序周游右子树。前序遍历二叉树(preorder traversal)例如, 图5.1中的二
9、叉树按照前序周游的结果为: A B D C E G F H I16中序周游中序周游(inorder traversal) 若二叉树非空, 则依次进行如下操作: (1) 中序周游左子树; (2) 访问根结点; (3) 中序周游右子树。中序遍历二叉树(inorder traversal)例如, 图5.1中的二叉树按照中序周游的结果为: B D A G E C H F I17后序周游后序周游(postorder traversal) 若二叉树非空, 则依次进行如下操作: (1) 后序周游左子树; (2) 后序周游右子树; (3) 访问根结点。后序遍历二叉树(postorder traversal)例
10、如, 图5.1中的二叉树按照后序周游的结果为: D B G E H I F C A18已知二叉树的前序和中序周游序列如下已知二叉树的前序和中序周游序列如下, 画画出该二叉树。出该二叉树。 前序周游序列前序周游序列: ABCDEFGHIJ 中序周游序列中序周游序列: CBEDAGHFJI ABCDEFGHIJ课堂练习课堂练习19已知二叉树的后序和中序周游序列如下已知二叉树的后序和中序周游序列如下, 画画出该二叉树。出该二叉树。 后序周游序列后序周游序列: ABCDEFG 中序周游序列中序周游序列: ACBGEDF G CABFED课堂练习课堂练习20画出中序周游序列为画出中序周游序列为ABCDE
11、FGHIJKL的的完全二叉树。完全二叉树。HDBFEKJILACG课堂练习课堂练习21上面三种周游方法都可以用递归函数来实现例如, 前序周游二叉树的函数为:void preorder(BinNode* subroot) if (subroot = NULL) return; visit(subroot); preorder(subroot-left(); preorder(subroot-right();遍历二叉树的递归实现22课后思考课后思考 思考遍历算法的非递归思考遍历算法的非递归。 由先序、中序和后序中由先序、中序和后序中任意两个序列能够唯一任意两个序列能够唯一确定一颗二叉树确定一颗二叉
12、树?23遍历算法的应用举例1、统计二叉树中叶子结点的个数、统计二叉树中叶子结点的个数 (先序遍历先序遍历)2、求二叉树的深度、求二叉树的深度(后序遍历后序遍历)3、复制二叉树、复制二叉树(后序遍历后序遍历)4 4、建立二叉树的存储结构、建立二叉树的存储结构241、统计二叉树中叶子结点的个数算法基本思想算法基本思想: : 先序(或中序或后序)遍历二叉树,在遍历过程中查找叶子结点,并计数。由此,需在遍历算法中增添一个需在遍历算法中增添一个“计数计数”的参数,的参数,并将算法中“访问结点”的操作改为:若是叶子,则计数器增若是叶子,则计数器增1 1。25void CountLeaf (BiTree T
展开阅读全文