数据结构-二叉堆
来源:互联网 发布:linux编辑模式怎么换行 编辑:程序博客网 时间:2024/06/06 04:54
(1)删除优先级最小的元素deletemin()
此操作分为3步:直接删除根;用最后一个元素代替根;将堆向下重新调整。
因为是最小堆,从根heap[1]开始,选取当前节点p的较小的儿子q。如果比p大,则调整停止,否则交换p和儿子的值,继续调整。
(2)向堆中插入一个新元素insert(x)
插入元素是先添加到末尾,再向上调整。
向上调整:比较当前节点p和其父节点,如果父节点比p小,则停止;否则交换父节点和p的值。继续从下向上调整。
(3)将p的优先级减小为a:
(4)建立堆build();
实现代码如下:
#include<iostream>using namespace std;int heap[]={4,1,3,2,16,9,10,14,8,7};int n;void down(int p){int q = p*2+1; //q为p的左儿子while(q <= n-1){ //n为堆中元素个数//选取两个儿子中的最小的一个if(q < n-1 && heap[q] > heap[q+1]) q++;if(heap[q] >= heap[p]) break; //如果儿子比父节点大,就结束。否则交换else{ int a = heap[p]; heap[p] = heap[q]; heap[q] = a;p = q;q = 2*p+1; }}}int deletemin(){int r = heap[1]; //取出最小元素heap[1] = heap[n--]; //把最后一个节点赋给根节点down(1); //向下调整return r;}void up(int p){int q = p/2; //计算当前节点p的父节点while(q >= 0 && heap[p] < heap[q]){//如果当前节点的值小于父节点的值,则交换int a = heap[p];heap[p] = heap[q];heap[q] = a;p = q;q = p/2;}}void insert(int a){heap[++n] = a; //先往堆里插入节点值up(n);//向上进行调整}void increasekey(int p, int a){if(heap[p] < a)return;heap[p] = a;up(p);}void build(){for(int i = n/2; i >= 0; --i)down(i);}int main(){ n=sizeof(heap)/sizeof(heap[0]); //可根据实际需要调用函数; for(int i=0;i<n;i++) { cout<<heap[i]<<" "; } return 0;}
阅读全文
0 0
- 【数据结构】二叉堆(堆)
- 数据结构 二叉堆 & 堆排序
- 数据结构之二叉堆
- 数据结构 之 二叉堆
- 数据结构之二叉堆
- 数据结构-二叉堆
- 数据结构 - 二叉堆
- 数据结构之二叉堆
- 数据结构-二叉堆
- 数据结构-二叉堆
- 数据结构-二叉堆
- 数据结构-二叉堆
- 【数据结构与算法】二叉堆
- 数据结构笔记-二叉堆[转]
- 【数据结构】二叉堆与左偏树
- 数据结构 二叉堆 数组实现
- 数据结构之(二叉)堆
- 数据结构学习之二叉堆
- springmvc之Jackson实现po对象与Json字符串的互转
- 关于弹性布局flex属性详解
- Android中Recyclerview使用12----实现瀑布流样式
- 6个轻松用好大数据的绝密秘籍
- Unity刚体、碰撞器、实验和总结
- 数据结构-二叉堆
- 飞秋(FeiQ)关闭好友上下线提示功能
- MFC对话框里利用CHtmlView加载界面(二)————MFC调用JaveScript
- 画图解释 SQL join 语句
- oracle删除用户以及用户数据
- 【Mybatis】深入浅出Mybatis(十二)——逆向工程后增删改查调用
- light oj 1234 Harmonic Number
- 第一个博客
- 找到一个超好用的navicat