数据结构之树形结构2-堆课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《数据结构之树形结构2-堆课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 树形 结构 课件
- 资源描述:
-
1、数据结构之树形结构1.什么是树?复习树 树是由n(n=0)个节点构成集合。特点是任何两个节点间有且仅有一条路径。ABCDEGHFLJK根节点:没有父亲的节点。一棵树只有一个根节点。EKJA每个节点可有0个或多个儿子节点除根节点外,每个结点有且只有一个父亲节点J和K是E的儿子节点E是J和K的父亲节点A是E的父节点没有儿子的节点称为叶节点,比如 F G H L J K 都是叶节点父亲相同的节点称为兄弟节点,比如 F G H 是兄弟节点的儿子的个数称为节点的度,比如 A 的度数为4祖先、子孙包含一个节点的所有子孙和该节点本身的集合,称为子树复习1.什么是树?2.什么是二叉树?复习1.什么是树?2.什
2、么是二叉树?3.二叉树第i层最多有多少个节点?复习1.什么是树?2.什么是二叉树?3.二叉树第i层最多有多少个节点?4.高度为h的二叉树最多有多少个节点?复习1.什么是树?2.什么是二叉树?3.二叉树第i层最多有多少个节点?4.高度为h的二叉树最多有多少个节点?5.二叉树叶节点和度为2的节点的关系是?复习二叉树(Binary tree)二叉树就是每个节点最多只有两个子节点的树。二叉树的特点:1.第i层上最多有 个节点2.高度为h的二叉树最多有 个节点2 2i-1i-12 2h h-1-13.在非空二叉树中,叶节点的个数等于度为2的节点个数加1ABCGFJKLM复习6.什么是完全二叉树?什么是满
3、二叉树?复习二叉树每层节点数都达到最大的二叉树树叫满二叉树ABCGFJK满二叉树除最底层外,其余各层节点都达到最大值,且最底层的节点集中在左侧的连续位置上的二叉树叫完全二叉树。ABCGFK完全二叉树复习1835627写出前序,中序,后续遍历序列前顺:1,8,5,3,6,7,2中序:8,5,1,7,6,2,3后续:5,8,7,2,6,3,1复习二叉堆(heap)二叉堆是完全二叉树任何一个节点都大于他的儿子节点的值(大根堆)或者任何一个节点都小于他的儿子节点的值(小根堆)父子,则堆顶元素值一定最大父1)/比如5号节点的父亲是2号节点结点heapi左孩子是heap2*i,右孩子是heap2*i+1
4、i=n/2根据堆的定义可以知道:对于大根堆:heap1最大heapih2*i且heapiheap2*i(1in/2)大根堆heap数组下标堆用一维数组来存储,父子关系可通过数组下标快速计算出来12 38 27 45 72 66 49 99已知下列数组表示一个堆,请画出这个堆!1238277266 4945下标 1 2 3 4 5 6 7 81234567998定理:堆的高度最大为log2(n+1)因为高度为h的二叉树最多有2h-1个节点。2h-1=n那么h=log2(n+1)怎样建堆?(小根)3建堆开始6574231387715216 3613建堆完毕36574231387数组heap初始时1
5、2345678910 11n=11 数组下标从第下标为n/2的节点开始,依次讨论下标为n/2+1,n/2+2,.,2,1建堆的时间复杂度为详细证明见算法导论第77页,或者算法分析与设计第74页13235537687数组heap建堆完毕后1234567891011堆的向下调整(小根)void shift(int i,int n)int k,t;t=heapi;k=2*i;while(k=n)if(kheapk+1)k+;if(theapk)heapi=heapk;i=k;k=2*i;else break;heapi=t;/把以i号节点(下标为i)为根的子树调整为堆,n为堆最后一个节点的下标(也就
6、是数组的长度)/k表示当前节点孩子的下标/找出值最小的孩子的下标/把值最小的孩子的值赋值给根/结束循环/把根的值赋值交换给孩子#define maxn 1000int heapmaxn;void shift(int i,int n)int k,t;t=heapi;k=2*i;while(k=n)if(kheapk+1)k+;if(theapk)heapi=heapk;i=k;k=2*i;else break;heapi=t;3655231387715216 36131234567891011堆的向下调整(小根)void shift(int i,int n)int k,t;t=heapi;k=2
7、*i;while(k=n)if(kheapk+1)k+;if(theapk)heapi=heapk;i=k;k=2*i;else break;heapi=t;/把以i号节点(下标为i)为根的子树调整为堆,n为堆最后一个节点的下标(也就是数组的长度)/k表示当前节点孩子的下标/找出值最小的孩子的下标/把值最小的孩子的值赋值给根/结束循环/把根的值赋值交换给孩子#define maxn 1000int heapmaxn;建堆:for(i=n/2;i=1;i-)shift(i,n);调整一次堆的时间复杂度在最坏情况下是堆排序堆排序的基础选择排序堆排序的实质是利用二叉堆优化选择排序堆排序步骤:建堆。将
8、所有节点布置成堆结构取出堆顶节点把堆尾的节点移动至顶部,调整此堆跳转至2步骤,直至堆为空堆排序选择与维护13235537687取出堆顶节点7127 37288338 68一、取出 cout0)coutheap1;heap1=heapn-;shift(1,n);排序int heap100,t,j,n;void shift(int i,int n)int k,t;t=heapi;k=2*i;while(k=n)if(kheapk+1)k+;if(theapk)heapi=heapk;i=k;k=2*i;else break;heapi=t;int main()cinn;for(j=1;jheap
9、j;for(j=n/2;j=1;j-)shift(j,n);while(n0)coutheap1;heap1=heapn-;shift(1,n);return 0;例:NK宇宙班题目描述:CQNK中学高一年级总共有n(n=500000)个学生。现在你有他们的“星际语”成绩单,要从中找出“星际语”成绩最好的m(m=1000并且mn)个学生组成宇宙班,请按由高到低的顺序打印出加入于周班学生的“星际语”成绩。输入格式:第一行,两个整数n和m第二行,n个用空格间隔的整数,分别表示n个学生的“星际语”成绩输出格式:只有一行,m个空格间隔的整数,表示加入宇宙班学生的“星际语”成绩。样例输入:12 589
展开阅读全文