二叉堆
二叉堆是一种特殊的堆,二叉堆有两种最大堆和最小堆。
最大堆:父节点的键值总是大于或等于任何一个子节点的键值;
最小堆:父节点的键值总是小于等于任何一个子节点的键值;
这个键值不一定是传统数值,一般指优先级;
基本操作:插入节点,删除节点,构建二叉堆,取出值最小的节点,减小节点的值等;
插入节点
二叉堆的节点插入,插入的位置是最后一个位置;
节点0与父节点5比较,0<5,0节点就与父节点交换位置;
重复上述操作,直到不能交换;
代码实现
void push(int x)//插入堆的值
{
int now = size++;//插入节点的编号
while(now > 0)
{
int f = (now - 1)/2;//父亲节点的编号
if(heap[f] <= x)
break;//如果顺序未颠倒,则退出循环
heap[now] = heap[f];
now = f;
}
heap[now] = x;
}
删除节点
删除与插入有点不一样,一般删除堆顶节点;
然后把堆顶与最后一个节点交换,并把交换后的最后一个节点删除;
然后找其左右孩子中较小的,如果大于较小的,则进行交换,直到不能交换;
代码实现
int pop()
{
int res = heap[0];
int x = heap[--size];//最末尾的节点
int i = 0;//从根节点开始操作
while(i * 2 + 1 < size)
{
int lchild = 2 * i + 1;
int rchild = 2 * i + 2;
if(rchild < size&& heap[rchild] < heap[lchild])lchild = rchild;
if(heap[lchild] >= x) break;//如果x已经在lchild上层了,就可以停止了
heap[i] = heap[lchild];
i = lchild;
}
heap[i] = x;
return res;
}