最大堆的初始化、插入和删除
来源:互联网 发布:淘宝评价怎么看不到 编辑:程序博客网 时间:2024/05/22 13:45
最大堆为完全二叉树,采用数组存放数据,父节点的值永远比左右孩子大,但兄弟之间值的大小并不确定。
Heap.h:
#ifndef HEAP_H_INCLUDED#define HEAP_H_INCLUDED#include<iostream>using namespace std;int const MAX = 20;template<class T>class MaxHeap{private: T compTree[MAX]; //堆中用来存完全二叉树的数组,MAX 为最多能存的结点数 int num; //实际存放数据的完全二叉树的结点数public: MaxHeap(T arr[], int length){ //参数为一个数组,在堆中存放为完全二叉树 num = length; for(int i = 0; i < num; i ++){ compTree[i] = arr[i]; } print(); init(); //初始化最大堆 } void init(){ int i = (num - 2) / 2; //完全二叉树中最后一个不是叶子结点的结点的下标 int index = i; for(; i >= 0; i --){ //从最后一个不是叶子结点的结点开始向前调整大小顺序,直到根结点 int j = i; while(j <= index){ //当前结点若有孩子就一直向下调整 int temp = adjust(j); if(temp == -1) break; j = temp; } } } int adjust(int j){ //调整一个结点和它的两个孩子的位置,若不需改变返回-1,否则返回与父节点交换值得孩子结点的下标 T temp; int index; //记录值较大的孩子结点的下标 if(isLeaf(j)) //如果是叶子结点则不需要调整 return -1; if(2*j+2 >= num) //如果当前结点没有右孩子,index等于左孩子下标 index = 2*j+1; else //完全二叉树不是叶子结点,有右孩子一定有左孩子,比较大小 index = (compTree[2*j+1] > compTree[2*j+2])? 2*j+1 : 2*j+2; if(compTree[j] < compTree[index]){ //如果当前结点的值小于其孩子结点的值,则交换,返回此孩子结点的下标 temp = compTree[j]; compTree[j] = compTree[index]; compTree[index] = temp; return index; } return -1; } bool isLeaf(int index){ //判断是否为叶子结点 return (index > (num - 2) / 2); } void print(){ //打印最大堆 for(int i = 0; i < num; i ++){ cout<<compTree[i]<<" "; } cout<<endl; } void insert(T item){ //插入,直接插到数组结尾保证是完全二叉树,再向上比较,一层一层调整 int index = (num - 1) / 2; //最后一个不是叶子结点的结点的下标 int i = 0; compTree[num] = item; ++num; while(index >= 0){ //向上调整 i = adjust(index); if(i == -1) break; index = (index - 1) / 2; } } void del(T item){ //删除结点,把最末尾的值填入要删除的位置,删除最末位,再向下调整 int index; //记录要删除结点的下标 for(int i = 0; i < num; i ++){ //查找要删除的结点 if(item == compTree[i]) index = i; } --num; compTree[index] = compTree[num]; //用尾结点的值替换当前结点 while(index <= (num - 2) / 2){ //当前结点若有孩子就一直向下调整 int temp = adjust(index); if(temp == -1) break; index = temp; } }};#endif // HEAP_H_INCLUDED主函数测试 main.cpp:
#include"Heap.h"int main(){ int arr[10] = {20, 12, 35, 15, 10, 80, 30, 17, 2, 1}; MaxHeap<int> heap(arr, 10); heap.print(); heap.insert(100); heap.print(); heap.del(80); heap.print(); return 0;}
阅读全文
0 0
- 最大堆的插入,删除和初始化
- 最大堆的初始化、插入和删除
- 最大堆的插入、删除、初始化
- 最大堆的插入 删除 初始化 堆排序
- 最大堆的创建、插入和删除
- 最大堆的插入和删除
- 最大堆的插入和删除
- 实现最大堆的插入和删除!
- 最大堆的初始化、删除、插入等基本操作
- 最大堆 插入和删除操作
- 最大最小堆的插入与删除
- 【数据结构】最大堆的插入与删除
- Java-最大堆的排序,插入,删除
- 最大堆,最小堆插入/删除以及最大堆的排序
- 最大堆的插入、弹出和生成
- 最大堆的插入
- 最大堆的插入/删除/调整/排序操作
- 堆插入和删除的简单实现
- Wannafly挑战赛3 C.位数差【思维+离散化+二分+树状数组】
- Java 对国际化 (i18n) 的支持&资源包的调用
- java技术交流: 10个有趣的Javascript和CSS库
- PG数据库在一些平台上的安装注意事项
- 343. Integer Break
- 最大堆的初始化、插入和删除
- java开发必看|Spring基础知识汇总
- 挂钩可用于各种构建步骤、
- TCP三次握手四次挥手详解
- tomcat配置本地开发虚拟域名
- 自动化engine-setup
- 深入理解JavaScript的对象模型
- 插入排序及优化(java实现)
- CVE-2011-0104浅析-excel栈溢出漏洞