从上到下,从左往右
大根堆
父节点的值大于或等于子节点的值
小根堆
父节点的值小于或等于子节点的值
插入(小根堆)
1、将新节点放到右下角空缺处(没有空缺则新起一行,加到这一行的第一个位置)
2、挑战父亲:如果比父亲小,则取代父亲位置
3、不断挑战父亲,知道比不过,或者成为根
void push(int x){
heap[++top] = x;
int i = top();
while(i > 1){
if(heap[i] < heap[i/2])
swap(heap[i], heap[i/2]);
i /= 2;//继续与父亲比
}
}
删除(小根堆)
1、交换堆顶和右下角(最后一个)
2、删除右下角(原来的堆顶)
3、堆顶此时非法,不断找最小的儿子与自己交换
void pop(){
swap(heap[1], heap[top]);
--top;
int i = 1;
while((i*2 <= top && heap[i] > heap[i*2])
||(i*2+1 <= top && heap[i] > heap[i*2+1])){
if(i*2+1 <= top && heap[i*2] > heap[i*2+1])//如果右儿子更小
i = i*2+1;
elas//左儿子更小
i = i*2;
swap(heap[i], heap[i/2]);
}
}
最小值:heap[1]
标签:,int,top,swap,heap,小根堆,节点 From: https://www.cnblogs.com/hnzzlxs01/p/16655963.html