性质
- 是一棵完全二叉树(不同于满二叉树)
- 堆中每一个节点的值总是不大于其父节点的值,也称最大堆(相应的也可以定义最小堆)
要注意的是,即使是最大堆,也并不意味着上一层的每个节点的值都大于下一层的节点值。
由于二叉堆是完全二叉树,因此完全可以使用数组来构建树,由上往下,由左往右,依次编号数组的索引,这里根节点可以编号0,也可以编号1(本文采取编号1)。通过这种方式,我们不仅可以构建二叉堆,还可以很轻松地得到每个节点的子节点和父节点的位置。第i个节点的父节点、左右子节点可以由以下的计算式推导得出:
parent(i) = i / 2;
leftChild = i * 2;
rightChild = i * 2 + 1;
操作
基本代码
由于其需要满足最大堆的特性,因此每个元素都需要有比较,在此继承Comparable。
public class MaxHeap<E extends Comparable<E>> {
private ArrayList<E> data;
public MaxHeap(int capacity) {
data = new ArrayList<>(capacity);
data.add(null);//因为本文采用从1开始序列
}
public MaxHeap() {
data = new ArrayList<>();
data.add(null);//因为本文采用从1开始序列
}
public int size() {
return data.size() - 1;
}
public boolean isEmpty() {
return size() == 0;
}
//获取父节点索引
private int parent(int index) {
if (index == 1) {
throw new IllegalArgumentException("root doesn't have parent");
}
return index / 2