二叉堆(一)之图文解析及C语言的实现.docxVIP

二叉堆(一)之图文解析及C语言的实现.docx

  1. 1、本文档共15页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
二叉堆(一)之图文解析及C语言的实现

二叉堆(一)之 图文解析 和 C语言的实现?概要本章介绍二叉堆,二叉堆就是通常我们所说的数据结构中堆中的一种。和以往一样,本文会先对二叉堆的理论知识进行简单介绍,然后给出C语言的实现。后续再分别给出C++和Java版本的实现;实现的语言虽不同,但是原理如出一辙,选择其中之一进行了解即可。若文章有错误或不足的地方,请不吝指出!目录1.?堆和二叉堆的介绍2.?二叉堆的图文解析3.?二叉堆的C实现(完整源码)4.?二叉堆的C测试程序转载请注明出处:/skywang12345/p/3610187.html更多内容:数据结构与算法系列 目录(01)?二叉堆(一)之 图文解析 和 C语言的实现(02)?二叉堆(二)之 C++的实现(03)?二叉堆(三)之 Java的实?堆和二叉堆的介绍堆的定义堆(heap),这里所说的堆是数据结构中的堆,而不是内存模型中的堆。堆通常是一个可以被看做一棵树,它满足下列性质:[性质一] 堆中任意节点的值总是不大于(不小于)其子节点的值;[性质二] 堆总是一棵完全树。将任意节点不大于其子节点的堆叫做最小堆或小根堆,而将任意节点不小于其子节点的堆叫做最大堆或大根堆。常见的堆有二叉堆、左倾堆、斜堆、二项堆、斐波那契堆等等。?二叉堆的定义二叉堆是完全二元树或者是近似完全二元树,它分为两种:最大堆和最小堆。最大堆:父结点的键值总是大于或等于任何一个子节点的键值;最小堆:父结点的键值总是小于或等于任何一个子节点的键值。示意图如下:?二叉堆一般都通过数组来实现。数组实现的二叉堆,父节点和子节点的位置存在一定的关系。有时候,我们将二叉堆的第一个元素放在数组索引0的位置,有时候放在1的位置。当然,它们的本质一样(都是二叉堆),只是实现上稍微有一丁点区别。假设第一个元素在数组中的索引为 0 的话,则父节点和子节点的位置关系如下:(01) 索引为i的左孩子的索引是 (2*i+1);(02) 索引为i的左孩子的索引是 (2*i+2);(03) 索引为i的父结点的索引是 floor((i-1)/2);?假设第一个元素在数组中的索引为 1 的话,则父节点和子节点的位置关系如下:(01) 索引为i的左孩子的索引是 (2*i);(02) 索引为i的左孩子的索引是 (2*i+1);(03) 索引为i的父结点的索引是 floor(i/2);?注意:本文二叉堆的实现统统都是采用二叉堆第一个元素在数组索引为0的方式!?二叉堆的图文解析在前面,我们已经了解到:最大堆和最小堆是对称关系。这也意味着,了解其中之一即可。本节的图文解析是以最大堆来进行介绍的。二叉堆的核心是添加节点和删除节点,理解这两个算法,二叉堆也就基本掌握了。下面对它们进行介绍。?1. 添加假设在最大堆[90,80,70,60,40,30,20,10,50]种添加85,需要执行的步骤如下:如上图所示,当向最大堆中添加数据时:先将数据加入到最大堆的最后,然后尽可能把这个元素往上挪,直到挪不动为止!将85添加到[90,80,70,60,40,30,20,10,50]中后,最大堆变成了[90,85,70,60,80,30,20,10,50,40]。?最大堆的插入代码(C语言)/* * 最大堆的向上调整算法(从start开始向上直到0,调整堆) * * 注:数组实现的堆中,第N个节点的左孩子的索引值是(2N+1),右孩子的索引是(2N+2)。 * * 参数说明: * start -- 被上调节点的起始位置(一般为数组中最后一个元素的索引) */static void maxheap_filterup(int start){ int c = start; // 当前节点(current)的位置 int p = (c-1)/2; // 父(parent)结点的位置 int tmp = m_heap[c]; // 当前节点(current)的大小 while(c 0) { if(m_heap[p] = tmp) break; else { m_heap[c] = m_heap[p]; c = p; p = (p-1)/2; } } m_heap[c] = tmp;}/* * 将data插入到二叉堆中 * * 返回值: * 0,表示成功 * -1,表示失败 */int maxheap_insert(int data){ // 如果堆已满,则返回 if(m_size == m_capacity) re

文档评论(0)

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

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

1亿VIP精品文档

相关文档