数据结构之堆(heap)

首先值得一提的是,我们说的数据结构中的堆和内存中的堆是两个不同的东西,关于这点不要混淆两者,以为两个是相同的东西。
堆的定义
那么,数据结构中的堆到底是什么呢?
堆的底层原理就是完全二叉树,完全二叉树?什么是完全二叉树?先看一个完全二叉树
在这里插入图片描述完全二叉树;除了最底层,其余层都是满的,并且最后一层的结点都是从左向右排序。或者最后一层也是满的。
堆就是由数组实现的二叉树,可以说堆一定是完全二叉树,而完全二叉树不一定是堆。
堆的常用方法
1、构造优先队列
2、支持堆排序
3、快速找到集合中的最大值和最小值
堆的属性
一个堆可以分为大根堆和小根堆,这两种堆的区分方式就是节点的排序方式。
大根堆:父节点的数字总是比子节点的数字大。只需要保证子节点总是大于父节点即可,不必保证左子树小于右子树。
小根堆:父节点的数字总是比子节点的数字小。
大根堆:
在这里插入图片描述
10作为7和2的父节点,10比7和2大。7作为5和1的父节点,7比5和1大。
小根堆可以类比于大根堆。
堆的插入
以上面的堆为例,插入一个数字16:
在这里插入图片描述
我们可以看到,此时的结构并不符合堆的定义,因为是大根堆,父节点要大于子节点,而16要大于2,所以交换16和2的位置。
在这里插入图片描述
但是此刻10小于16,交换两个的位置:
在这里插入图片描述
这个时候堆中的每个父节点都是大于子节点。
堆的删除
还是以刚才的堆为例,将堆中的10删除。
在这里插入图片描述
根节点删除了,空出来的节点怎么办?我们取最后一个值,插入到根节点的位置:
在这里插入图片描述
为了要符合大根堆,需要将1与7、2交换,与子节点交换时选择与子节点的最大值进行交换。
在这里插入图片描述
而此时父节点1小于子节点5,交换两个节点:
在这里插入图片描述
至此,完成堆的删除操作。
堆的一些操作
shiftUp(): 如果一个节点比它的父节点大(最大堆)或者小(最小堆),那么需要将它同父节点交换位置。这样是这个节点在数组的位置上升。
shiftDown(): 如果一个节点比它的子节点小(最大堆)或者大(最小堆),那么需要将它向下移动。这个操作也称作“堆化”。
insert(value): 在堆的尾部添加一个新的元素,然后使用 shiftUp 来修复对。
remove(): 移除并返回最大值(最大堆)或者最小值(最小堆)。为了将这个节点删除后的空位填补上,需要将最后一个元素移到根节点的位置,然后使用 shiftDown 方法来修复堆。
removeAtIndex(index): 和 remove() 一样,差别在于可以移除堆中任意节点,而不仅仅是根节点。当它与子节点比较位置不时无序时使用 shiftDown(),如果与父节点比较发现无序则使用 shiftUp()。
replace(index, value):将一个更小的值(最小堆)或者更大的值(最大堆)赋值给一个节点。由于这个操作破坏了堆属性,所以需要使用 shiftUp() 来修复堆属性。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值