二叉堆(最小堆)(数据结构与算法分析的代码实现)
“堆是一棵被完全填满的二叉树,可能的例外是在底层,底层上的元素从左到右填入。这样的树称为完全二叉树”
“因为完全二叉树很有规律,所以可以用一个数组表示而不需要使用链”
上面两句是摘自《数据结构与算法分析》
书中代码的上滤和下滤的实现比算法导论的好,算法导论通过递归,每一次都交换不合适的节点,书本的代码则是通过循环找到节点正在要移动到的位置。
参考算法导论的代码:http://www.cnblogs.com/alan-forever/archive/2012/09/26/2704860.html
算法导论的是堆排序的代码,不过堆的性质都有的。
下面的代码是最小堆的,而且是一个类模板。
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
二叉堆(最小堆)(数据结构与算法分析的代码实现)相关推荐
- libevent(二)尾队列 最小堆
本文主要研究libevent中用来存储事件的两个结构体. 尾队列 具体定义位于queue.h中. #define TAILQ_HEAD(name, type) \ struct name { \str ...
- 剑指offer(C++)-JZ36:二叉搜索树与双向链表(数据结构-树)
作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.如下图所示 数据范围:输 ...
- 堆 最小堆 最大堆 堆排序(小到大,大到小)
导航 1.了解什么是堆 2.如何创建最小堆,最大堆 3.新增值在堆中如何进行 4.完整的堆排序,升序和降序(两种方式) ---------------------------------------- ...
- 二叉搜索树【Java数据结构】
目录 搜索树 1.概念 2. 操作-查找 3. 操作-插入 4. 操作-删除 5. 代码实现 搜索树 1.概念 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 若它的左子树不 ...
- 二叉搜索树(BST)详解及代码实现
推荐可视化插入.删除节点的二叉树网站:Binary Search Tree Visualization (usfca.edu) 1. 概述 二叉搜索树(Binary Search Tree,简称BST ...
- 二叉平衡树之AVL树【手动实现代码】
目录 1.AVL树的概念 2.AVL树定义节点 3.AVL树的插入 4.AVL树的旋转 4.1.新节点插入较高左子树的左侧--右单旋 4.2.新节点插入较高右子树的右侧--左单旋 4.3.新节点插入较 ...
- java 二叉堆_二叉堆(三)之 Java的实现
概要 前面分别通过C和C++实现了二叉堆,本章给出二叉堆的Java版本.还是那句话,它们的原理一样,择其一了解即可. 二叉堆的介绍 二叉堆是完全二元树或者是近似完全二元树,按照数据的排列方式可以分为两 ...
- Java PriorityQueue(优先级队列/二叉堆)的使用及题目应用
目录 PriorityQueue有几个需要注意的点: 重写比较器的方法 应用题目 LeetCode 1845. 座位预约管理系统 LeetCode 215. 数组中的第 K 个最大元素(同剑指 Off ...
- 二叉堆 - 原理与实现
1. 概要 本章介绍二叉堆,二叉堆就是通常我们所说的数据结构中"堆"中的一种.和以往一样,本文会先对二叉堆的理论知识进行简单介绍,然后给出C语言的实现.后续再分别给出C++和Jav ...
最新文章
- 英特尔九州云99Cloud OpenStack行业应用研讨会
- 蓝桥杯java 算法提高 摆花
- SpringCloud教程- 服务链路追踪(Spring Cloud Sleuth)(SpringCloud版本Greenwich.SR4)
- 大数据互联网架构阶段 数据库三范式与反范式
- 【Qt】Qt5.12连接MySQl5.7(亲自测试成功)
- 【转】15个超炫的HTML5效果
- paip.版本控制CVS-SVN-TFS总结
- java JDK1.8中文手册
- 学计算机笔画,学汉字学笔顺电脑版
- ExoPlayer之SampleQueue
- 入门OJ 3168【等式】
- 如何查看自己win10的产品密钥
- dw html图片居中,dw怎么把整个表格居中 怎么在dw里面把整个网页居中?
- 深圳大学计算机考研初试+复试经验
- 论文阅读: (ECCV 2022) Content-Oriented Learned Image Compression
- NosqlBooster For MongoDB解决License问题
- 苍南五凤茶进杭城“香”约西湖龙井, 茶旅融合助力乡村振兴!
- php 事件驱动,详述PHP事件驱动问题的理解
- 80%的人都不知道在Excel中掐头去尾求平均分用这个函数
- linssh2 sftp读取远端目录,获取远端文件或者目录信息
热门文章
- 招人信息,请斟酌后联系偶!
- 迅速返回页面顶部代码
- engineering likes?
- regardless what you do
- what should you do if you can be silent and do things
- macOS的关于屏幕录制的快捷键和操作
- 周赛 Hd2270+总结改进
- (十二)java版电子商务spring cloud分布式微服务- Spring 4.2.2以上版本和swagger集成方案和踩过的坑...
- Android:手把手带你深入剖析 Retrofit 2.0 源码
- 使用setfacl实现子目录继承父目录权 限