java 数据结构--堆

1.堆的基本定义

二叉树的两种结构,一种是链式结构,一种就是顺序结构,普通二叉树其实是不适合用数组来存储数据,因为会造成大量空间的浪费,但完全二叉树似乎更合适于顺序结构存储,我们通常把堆(完全二叉树) 使用顺序数组来存储。
堆:
(1)堆就是将一个集合的数据按照完全二叉树的顺序结构存储在一个一维数组中,堆在逻辑上是一棵完全二叉树,在物理结构上是一个一维数组.
(2)堆也被称为优先队列。队列中允许的操作是先进先出(FIFO),在队尾插入元素,在队头元素。堆遵循同样的原理,在堆顶取出元素,但是堆中元素的排列,不是按照到来的先后顺序,而是按照一定的优先顺序排列的,排列的优先顺序可以是元素大小或者其他规则。

2.堆的结构和性质

在这里插入图片描述
(1) 最大堆、最小堆性质
每个结点的值都大于其左孩子和右孩子结点的值,称之为大根堆;
每个结点的值都小于其左孩子和右孩子结点的值,称之为小根堆。
结合下面数组说明:
大根堆:arr(i)>arr(2i+1) && arr(i)>arr(2i+2)
小根堆:arr(i)<arr(2i+1) && arr(i)<arr(2i+2)

(2) 按上图标号映射成数组
在这里插入图片描述
说明: 查找数组中某个数的父结点和左右孩子结点。例如已知索引为 i 的数,那么
1.父结点索引:( i -1 )/2 计算机省略计算的小数部分
2.左孩子索引:2i +1
3.右孩子索引:2
i +2

3. 堆的主要操作

(1)插入(添加一个新节点)
当插入一个元素时,先将这个元素插入到队列尾,然后将这个新插入的元素和它的父节点进行优先权的比较,如果比父节点的优先权要大,则和父节点互换位置,然后再和新的父节比较,直到比新的父节点优先权小为止。
在这里插入图片描述
说明:通过新元素与父结点调换位置的操作叫做上滤。

(2)删除一个节点
堆的删除操作和插入操作相反,插入操作从下往上调整堆,而删除操作则是从上往下调整堆。删除堆顶元素,比较左右子节点,将小的元素上调。不断进行步骤2,直到不需要调整或者调整到堆底。
在这里插入图片描述

(3)创建堆
在这里插入图片描述说明:上述代码中的heapify为向下调整为大堆。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值