最小二叉堆
来源:互联网 发布:社交网络电影剧情介绍 编辑:程序博客网 时间:2024/05/29 18:42
最小二叉堆
#include <iostream>#include <vector>using namespace std;//模板函数的实现与声明要写在一个文件中template <class comparable>class binaryMinHeap {public: binaryMinHeap(); void insert(const comparable &value); void deleteMin(); void print(); void clear(); bool isExisted(const comparable &value);private: vector<comparable> arr; int size;};template <class comparable>binaryMinHeap<comparable>::binaryMinHeap() { arr.push_back(0); size = 0;}template <class comparable>void binaryMinHeap<comparable>::insert(const comparable &value) { if (size == 0) { arr.push_back(value); size++; } else { arr.push_back(0); int childPos = size + 1, parentPos = childPos / 2; while (1) { comparable parentValue = arr[parentPos]; if (parentPos == 0 || parentValue <= value) { arr[childPos] = value; size++; break; } else { arr[childPos] = parentValue; childPos /= 2; parentPos = childPos / 2; } } }}//从根节点开始寻找最小子节点去替换父节点的值//直到找到一个适合最后一个节点插入的位置template <class comparable>void binaryMinHeap<comparable>::deleteMin() { if (size == 0) return; //取得最后一个位置的节点值 comparable temp = arr[size]; size--; int parent = 1, left = 2, right = 3; while (1) { right = left + 1; //无节点 if (left > size) { arr[parent] = temp; break; } //只有一个节点 else if (right > size) { if (arr[left] < temp) { arr[parent] = arr[left]; arr[left] = temp; break; } else { arr[parent] = temp; break; } } //有两个节点 comparable l = arr[left], r = arr[right]; comparable min = l > r ? r : l; left = l > r ? right : left; if (min < temp) { arr[parent] = arr[left]; parent = left; left *= 2; } else { arr[parent] = temp; break; } }}template <class comparable>void binaryMinHeap<comparable>::print() { for (int i = 1; i <= size; i++) { cout << arr[i] << ' '; } cout << endl;}template <class comparable>void binaryMinHeap<comparable>::clear() { size = 0; arr.clear(); //填充首位置是为了让第一个元素放在1而不是0位置上 arr.push_back(0);}template <class comparable>bool binaryMinHeap<comparable>::isExisted(const comparable& x) { int i = 1; while (i <= size) { int temp = i * 2; //遍历每一层去搜索,若一层中所有节点的值都小于搜索值则表示搜索值不在堆中 int smallerCount = 0; while (i <= temp) { if (i > size) break; else if (x == arr[i]) return true; else if (x < arr[i]) smallerCount++; i++; } if (smallerCount == temp) return false; } return false;}
0 0
- 二叉树 最小堆
- 最小二叉堆
- 最小二叉堆
- 二叉树存储 最小堆
- 数据结构二叉堆C++实现 最小堆
- java 实现最小二叉堆排序
- 试写二叉最小堆和最大堆
- 最小优先级队列(基于最小二叉堆算法)
- 堆优先用完全二叉树表示、堆的特性和最大最小堆
- 最小二叉堆代码(基于一整形数组实现)
- VC++2012编程演练数据结构《27》最小堆二叉树
- [Wikioi 1245][二叉堆]最小的N个和
- 最小生成树---prim模板(二叉堆优化)
- 最小堆
- 最小堆
- 最小堆
- 最小堆
- 最小堆
- HDU 1064.Financial Management【超级无敌大水题】【9月1】
- GIT刷新忽略文件.gitignore
- 训犬日志--狗狗定点排便
- 查找字典中某个公共前缀的所有单词
- java反射机制
- 最小二叉堆
- Android 网络编程——Socket,HTTP,SOAP辨析
- 自己对于MVC开发模式的理解-2
- Dancing Link讲解
- spark源码剖析之----Shuffle
- 远程重启服务器的有效办法?
- 实现pdf图片格式转换成txt文档的方法
- Jquery Mobile入门笔记
- 软工视频第二章之制定计划