设计背景
二叉树有满二叉树(Full binary Tree)和完全二叉树(Complete Binary Tree)等特殊情况,满二叉树指“除了叶子节点外,所有节点都有左子树和右子树”,它的叶子节点只会出现在最后一层;而完全二叉树因为有的节点可能缺失子树,所以它的叶子节点可能出现在最后的两层中。
而堆(Heap)可以看作一颗完全二叉树的数组,堆有最大堆(MaxHeap)和最小堆(MinHeap)之分,最大堆中某个节点的值一定不大于其父节点的值,而最小堆中某个节点的值一定不小于其父节点的值。
结构分析
【底层实现】动态数组(ArrayList)
【核心方法】
public void add(E e); //添加元素
private void siftUp(int k); //元素上浮
public E extractMax(); //删除堆中最大的元素
private void siftDown(int k); // 元素下浮
public E replace(E e); //替换堆中指定的元素
public E findMax(); // 找到堆中最大的元素
【特别注意】堆所依赖的数组需要增加两个方法:
/**
* 带参构造器:对实例域进行初始化
* @param arr 数组
*/
public ArrayList(E[] arr) {
data = (E[])new Object[arr.length];
for (int i = 0; i < arr.length; i++) {
data[i] = arr[i];
}
size = arr.length;
}
/**
* 方法:交换两个元素的位置
* @param i 第一个元素的索引
* @param j 第二个元素的索引
*/
public void swap(int i, int j) {
if (i < 0 || i >= size || j < 0 || j >= size) {
throw new IllegalArgumentException("Index is illegal!");
}
E t = data[i];
data[i] = data[j];
data[j] = t;
}
代码实现
利用动态数组实现堆:
<