首页 > 其他分享 >堆

时间:2022-09-04 20:35:52浏览次数:45  
标签: int top swap heap 小根堆 节点

从上到下,从左往右

大根堆

父节点的值大于或等于子节点的值

小根堆

父节点的值小于或等于子节点的值

插入(小根堆)

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

相关文章