堆(Heap)是一种特殊的二叉树,有以下两个特点:
1.堆是一个完全二叉树;
2.堆中每个节点的值都必须大于等于其子树中每个节点的值(大顶堆)或小于等于其子树中每个节点的值。(小顶堆)。
1、堆的实现
1.1、堆的储存方式
对于完全二叉树而言,采用数组进行储存是一个非常不错的选择,例如上图中的两个堆采用数组进行储存则结构为:
此处有点特殊的是,数组下标为0的位置闲置没有储存数据。在这种情况下,对于下标为i的元素,其左右子树的下标分别为2i和2i+1,父节点则为i/2。
1.2、堆的核心操作
插入元素
插入元素的过程可以分为两步:将插入元素放入数组末尾的空位、堆化使插入新数据后的堆满足开头所谈到的两点要求,核心步骤是对插入后的堆进行堆化。
堆化的过程有两种思路进行实现,自上往下和自下往上,这两种思路的核心都是沿着节点所在的路径进行比较并操作,以下以大顶堆为例,给出插入操作的代码:
public class MyHeap {
private int[] arr;//用于储存元素的数组
private int n;//堆最多可以储存的元素个数
private int count;//堆中已经储存的元素个数
public MyHeap(int capaccity) {
this.arr = new int[capaccity + 1];
this.n = capaccity;
this.count = 0;
}
public boolean insert(int data) {
if (count == n)
return false;
arr[++count] = data;
//将插入到最后的元素找到应该的位置,实现堆化
//此处从下至上进行堆化
int i = count;
while (i / 2 > 0 && arr[i / 2