介绍:
一种完全二叉树或者近似完全二叉树
构成:
下标为 i 的节点:
父节点: i/2 向下取整
左子节点:i*2
右子节点:i*2+1
大根堆(最大堆)
根节点为堆中最大值,各 父节点的键值 >= 左右子节点的键值
小根堆(最小堆)
根节点为堆中最小值,各 父节点的键值 <= 左右子节点的键值
注意:
只有父子节点间具有大小关系,兄弟节点之间并无限制
代码实现:(以大根堆为例)
//使以 i 节点为根节点的子树成为最大堆
void maxHeapify(int i)
{
int l,r,piovt;
l=i*2;
r=l+1;
piovt=i;
if(l<=size&&Hp[l]>Hp[piovt]) piovt=l;
if(r<=size&&Hp[r]>Hp[piovt]) piovt=r;
if(i!=piovt)
{
swap(Hp[i],Hp[piovt]);
maxHeapify(piovt);
}
}
//建堆
void build_max_heap()
{
for(int i=Hp.size/2;i>=1;i++)
{
maxHeapify(i);
}
}
//每次执行maxHeapify时i的左右子树都已经是大根堆
//删除根节点
swap(Hp[1],Hp[size--]);
maxHeapify(1);
//删除k节点
swap(Hp[k],Hp[size--]);
maxHeapify(k);
STL优先队列
priority_queue <int,vector<int>,greater<int> > q; 小根堆
priority_queue <int,vector<int>,less<int> >q; 大根堆