“堆是一棵被完全填满的二叉树,可能的例外是在底层,底层上的元素从左到右填入。这样的树称为完全二叉树”

“因为完全二叉树很有规律,所以可以用一个数组表示而不需要使用链”

上面两句是摘自《数据结构与算法分析》

书中代码的上滤和下滤的实现比算法导论的好,算法导论通过递归,每一次都交换不合适的节点,书本的代码则是通过循环找到节点正在要移动到的位置。

参考算法导论的代码:http://www.cnblogs.com/alan-forever/archive/2012/09/26/2704860.html

算法导论的是堆排序的代码,不过堆的性质都有的。

下面的代码是最小堆的,而且是一个类模板。

View Code

  1 #include<iostream>
  2 #include<vector>
  3 using namespace std;
  4
  5 template <typename Comparable>
  6 class BinaryHeap
  7 {
  8 public:
  9     explicit BinaryHeap( int capacity = 100 ) : array( capacity + 10 )
 10     {
 11         currentSize = 0;
 12     }
 13
 14     explicit BinaryHeap( const vector<Comparable> & item ) : array( item.size() + 10 ), currentSize( item.size() )
 15     {
 16         for(int i = 0; i < item.size(); ++i)
 17             array[i+1] = item[i];
 18         buildHeap();
 19     }
 20
 21     bool isEmpty() const
 22     {
 23         return currentSize == 0;
 24     }
 25
 26     const Comparable & finMin( ) const
 27     {
 28         return array[1];
 29     }
 30
 31     void insert( const Comparable & x)
 32     {
 33         if(currentSize == array.size() - 1)
 34             array.resize( array.size() * 2);
 35
 36         int hole = ++currentSize;
 37         for(; hole > 1 && x < array[hole / 2]; hole /= 2)
 38             array[hole] = array[hole / 2];
 39         array[hole] = x;
 40     }
 41
 42     void deleteMin()
 43     {
 44         array[1] = array[currentSize--];
 45         percolateDowm( 1 );
 46     }
 47
 48     void deleteMin(Comparable & Min)
 49     {
 50         Min = array[1];
 51         deleteMin();
 52     }
 53
 54     void makeEmpty()
 55     {
 56         delete array[currentSize];
 57         currentSize = 0;
 58     }
 59
 60     void print( )
 61     {
 62         for(int i = 1; i <= currentSize; ++i)
 63             cout << array[i] << " ";
 64         cout << endl;
 65     }
 66
 67 private:
 68     int currentSize;
 69     vector<Comparable> array;
 70
 71     void buildHeap()
 72     {
 73         for(int i = currentSize / 2; i > 0; i--)
 74             percolateDowm( i );
 75     }
 76
 77     void percolateDowm( int hole )
 78     {
 79         int child;
 80         Comparable temp = array[hole];
 81
 82         for(; hole * 2 <= currentSize; hole = child)
 83         {
 84             child = hole * 2;
 85             if(child != currentSize && array[child + 1] < array[child])
 86                 child++;
 87             if(array[child] < temp)
 88                 array[hole] = array[child];
 89             else
 90                 break;
 91         }
 92         array[hole] = temp;
 93     }
 94 };
 95
 96 int main()
 97 {
 98     vector<int> a;
 99     int m;
100     for(int i = 0; i < 10; ++i)
101     {
102         cin >> m;
103         a.push_back( m );
104     }
105     BinaryHeap<int> minHeap( a );
106     cin >> m;
107     minHeap.insert( m );
108     minHeap.deleteMin();
109     minHeap.print();
110     return 0;
111 }

转载于:https://www.cnblogs.com/alan-forever/archive/2012/12/11/2813417.html

二叉堆(最小堆)(数据结构与算法分析的代码实现)相关推荐

  1. libevent(二)尾队列 最小堆

    本文主要研究libevent中用来存储事件的两个结构体. 尾队列 具体定义位于queue.h中. #define TAILQ_HEAD(name, type) \ struct name { \str ...

  2. 剑指offer(C++)-JZ36:二叉搜索树与双向链表(数据结构-树)

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.如下图所示 数据范围:输 ...

  3. 堆 最小堆 最大堆 堆排序(小到大,大到小)

    导航 1.了解什么是堆 2.如何创建最小堆,最大堆 3.新增值在堆中如何进行 4.完整的堆排序,升序和降序(两种方式) ---------------------------------------- ...

  4. 二叉搜索树【Java数据结构】

    目录 搜索树 1.概念 2. 操作-查找 3. 操作-插入 4. 操作-删除 5. 代码实现 搜索树 1.概念 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 若它的左子树不 ...

  5. 二叉搜索树(BST)详解及代码实现

    推荐可视化插入.删除节点的二叉树网站:Binary Search Tree Visualization (usfca.edu) 1. 概述 二叉搜索树(Binary Search Tree,简称BST ...

  6. 二叉平衡树之AVL树【手动实现代码】

    目录 1.AVL树的概念 2.AVL树定义节点 3.AVL树的插入 4.AVL树的旋转 4.1.新节点插入较高左子树的左侧--右单旋 4.2.新节点插入较高右子树的右侧--左单旋 4.3.新节点插入较 ...

  7. java 二叉堆_二叉堆(三)之 Java的实现

    概要 前面分别通过C和C++实现了二叉堆,本章给出二叉堆的Java版本.还是那句话,它们的原理一样,择其一了解即可. 二叉堆的介绍 二叉堆是完全二元树或者是近似完全二元树,按照数据的排列方式可以分为两 ...

  8. Java PriorityQueue(优先级队列/二叉堆)的使用及题目应用

    目录 PriorityQueue有几个需要注意的点: 重写比较器的方法 应用题目 LeetCode 1845. 座位预约管理系统 LeetCode 215. 数组中的第 K 个最大元素(同剑指 Off ...

  9. 二叉堆 - 原理与实现

    1. 概要 本章介绍二叉堆,二叉堆就是通常我们所说的数据结构中"堆"中的一种.和以往一样,本文会先对二叉堆的理论知识进行简单介绍,然后给出C语言的实现.后续再分别给出C++和Jav ...

最新文章

  1. 英特尔九州云99Cloud OpenStack行业应用研讨会
  2. 蓝桥杯java 算法提高 摆花
  3. SpringCloud教程- 服务链路追踪(Spring Cloud Sleuth)(SpringCloud版本Greenwich.SR4)
  4. 大数据互联网架构阶段 数据库三范式与反范式
  5. 【Qt】Qt5.12连接MySQl5.7(亲自测试成功)
  6. 【转】15个超炫的HTML5效果
  7. paip.版本控制CVS-SVN-TFS总结
  8. java JDK1.8中文手册
  9. 学计算机笔画,学汉字学笔顺电脑版
  10. ExoPlayer之SampleQueue
  11. 入门OJ 3168【等式】
  12. 如何查看自己win10的产品密钥
  13. dw html图片居中,dw怎么把整个表格居中 怎么在dw里面把整个网页居中?
  14. 深圳大学计算机考研初试+复试经验
  15. 论文阅读: (ECCV 2022) Content-Oriented Learned Image Compression
  16. NosqlBooster For MongoDB解决License问题
  17. 苍南五凤茶进杭城“香”约西湖龙井, 茶旅融合助力乡村振兴!
  18. php 事件驱动,详述PHP事件驱动问题的理解
  19. 80%的人都不知道在Excel中掐头去尾求平均分用这个函数
  20. linssh2 sftp读取远端目录,获取远端文件或者目录信息

热门文章

  1. 招人信息,请斟酌后联系偶!
  2. 迅速返回页面顶部代码
  3. engineering likes?
  4. regardless what you do
  5. what should you do if you can be silent and do things
  6. macOS的关于屏幕录制的快捷键和操作
  7. 周赛 Hd2270+总结改进
  8. (十二)java版电子商务spring cloud分布式微服务- Spring 4.2.2以上版本和swagger集成方案和踩过的坑...
  9. Android:手把手带你深入剖析 Retrofit 2.0 源码
  10. 使用setfacl实现子目录继承父目录权 限