堆
堆是一种满二叉树,每一层的节点要么是满的,否则一层的的节点都在的左侧;
由于堆具有的这种满二叉树的性质,所以我们可以用数组表示堆的结构,
例如:假如i表示节点,该节点左节点为 2 * i + 1;该节点右节点为 2 * i + 2,该节点的父节点 (i-1) / 2
为什么不使用链表的方式?链表需要增加左右指针比较浪费空间,而且无法实现从孩子节点找到父亲节点?如果要实现这种逻辑还需要增加额外的指针;
通过对比数组的优势时显而易见的;
这里的实现都是以小根堆为例子:
递归的方式实现:
1.根据数组初始化一个堆
2.向堆中插入一个元素
3.删除堆顶的元素
static class HeapStruct {
//堆的大小
private int size = 0;
//堆大小的限制
private int limit;
// 堆的数组结构
private int[] array;
// 将数组初始化成堆的数据结构
public HeapStruct(int[] array) {
this.size = array.length;
this.limit = array.length;
this.array = array;
initHeap(this.array);
}
//初始化一个最大为length的空堆
public HeapStruct(int length) {
this.size = 0;
this.limit = length;
this.array = new int[length];
}
//将一个数组初始化为一个堆
private void initHeap(int[] array)