【算法竞赛学习笔记】堆-超好懂的数据结构!!!

本文详细介绍了堆的数据结构,包括大顶堆和小顶堆的概念,以及上浮节点和下沉节点的实现方法。通过实例演示了如何插入和删除节点,并探讨了构建二叉堆的过程。此外,还提供了相关链接深入学习更高级主题,如可并堆和左偏树。
摘要由CSDN通过智能技术生成

title : 堆
date : 2021-8-3
tags : ACM,数据结构


在这里插入图片描述

什么是堆

堆是一棵具有特定性质的二叉树,堆的基本要求是堆中所有结点的值必须大于等于(或小于等于)其孩子结点的值,这也称为堆的性质。堆还有另一个性质,就是当h>0时,所有叶子结点都处于第h或h-1层,也就是说,堆应该是一棵完全二叉树。

堆的类型

大顶堆:顾名思义大的元素在顶部

小顶堆:顾名思义小的元素在顶部

堆的操作

上浮节点
void checkup(int node)  //与父节点比较向上更新
{
	if (node <= 1)
	{
		return;    //已经达到堆顶
	}
	if (tree[node]<tree[node >> 1]) //该节点比父节点要小
	{
		swap(tree[node], tree[node >> 1]); //交换两者
		checkup(node >> 1); //继续上浮
	}
}
下沉节点
void checkdown(int node)  //向下更新二叉堆
{
	if (node > num)
	{
		return;    //已经无法下沉
	}
	if (tree[node] < tree[node << 1] && tree[node] < tree[node << 1 | 1])
	{
		return;    //没有比子节点小则返回
	}
	if (tree[node << 1] < tree[node << 1 | 1]) //左儿子小于右儿子
	{
		swap(tree[node], tree[node << 1]); //交换左儿子
		if (node * 2 < num)
		{
			checkdown(node << 1);    //继续下沉
		}
	}
	else    //右儿子小于左儿子
	{
		swap(tree[node], tree[node << 1 | 1]);
		if (node * 2 + 1 < num)
		{
			checkdown(node << 1 | 1);
		}
	}
}
插入节点
void push(long long val)  //插入val
{
	tree[++num] = val; //先插入到最后的位置
	checkup(num); //对他进行上浮操作
}
删除节点
void pop()  //删除最小的数,即tree[1]
{
	tree[1] = tree[num]; //首先让最后的元素移动到堆顶
	tree[num] = inf; //原来的位置不再有任何元素
	num--;
	checkdown(1); //对堆顶进行下沉操作
}
构建二叉堆

把一个无序的完全二叉树调整为二叉堆,只需让所有非叶子节点依次下沉。

如果你已经学完了堆的基本知识,那么不妨看看可并堆和左偏树

https://blog.csdn.net/SC_Linno/article/details/120970965

参考资料

https://blog.csdn.net/qq_41900081/article/details/86670001

https://blog.csdn.net/qq_39445165/article/details/84932335

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RWLinno

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值