二叉堆学习总结
怎么说呢,二叉堆这个东西就是一个维护区间最大值和最小值的一个东西,可以被其他东西所部分替代,但是还是得讲一下二叉堆运作的原理,首先先上put函数代码。
void put(int x) // min
{
heap[++len] = x;
int son = len;
while (son > 1) {
int fa = son / 2;
if (heap[son] >= heap[fa]) return;
swap(heap[son], heap[fa]), son = fa;
}
return;
}
这是维护最小值的一个put函数,如果是最大值,把判断里面的大于改成小于就行了。
插入会先从树的低端开始插入,然后和父亲节点比较进行交换,从而维护最大值。
接下来讲get函数,也就是取最大最小值的一个函数。
int get() {
int res = heap[1];
heap[1] = heap[len--];
int fa = 1;
while (fa * 2 <= len) {
int son = fa * 2;
if (son + 1 <= len && heap[son] > heap[son + 1])
son++;
if (heap[son] > heap[fa])
break;
swap(heap[son], heap[fa]);
fa = son;
}
return res;
}
我们略微思考一下就可以知道,当取出了堆中的最值时,这个堆就被破坏掉了,那么怎么去维护呢,可以将堆头放入一个极小或者极大的数,进行向下操作,然后就可以继续维护着堆的稳定。