java 数据结构--堆

1.堆的基本定义

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

2.堆的结构和性质

java 数据结构--堆
(1) 最大堆、最小堆性质
每个结点的值都大于其左孩子和右孩子结点的值,称之为大根堆;
每个结点的值都小于其左孩子和右孩子结点的值,称之为小根堆。
结合下面数组说明:
大根堆:arr(i)>arr(2i+1) && arr(i)>arr(2i+2)
小根堆:arr(i)<arr(2i+1) && arr(i)<arr(2i+2)

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

3. 堆的主要操作

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

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

(3)创建堆
java 数据结构--堆说明:上述代码中的heapify为向下调整为大堆。