堆 Heap
1. 堆Heap
定义
堆是一颗安全二叉树,其结点含有Comparable的对象。在最大堆中,每个结点的对象都大于等于它的子孙结点中的对象。
public interface MaxHeapInterface<T extends Comparable<? super T>> {
public void add(T newEntry);
public T removeMax();
public T getMax();
public boolean isEmpty();
public int getSize();
public void clear();
}
2. 用数组表示堆
用数组表示完全二叉树:一个完全二叉树在其倒数第二层以上是满的,并且其最后一层上的叶子结点是从左到右填满的。因此,指导最后一片叶子,完全二叉树中没有空洞。
如果一颗二叉树是完全的,使用数组而不是链表会更好。可以使用层序遍历将这棵二叉树的数据存放到一个数组中的连续位置。这种表示可以容易地找到一个结点的双亲或孩子中的数据。如果从数组的索引1开始存放二叉树,即跳过数组的第一个位置,则数组索引i处结点的:
双亲在索引i/2处,除非该结点是根节点(i为1);
子结点在索引2i与2i+1处。

MaxHeap类
public class MaxHeap<T extends Comparable<? super T>> implements
MaxHeapInterface<T>, Serializable {
private T[] heap; // 存放堆元素的数组
private int lastIndex; // 最后一个元素的索引
private static final int DEFAULT_INITIAL_CAPACITY = 25;
public MaxHeap() {
this(DEFAULT_INITIAL_CAPACITY);
}
public MaxHeap(int initialCapacity) {
heap = (T[]) new Comparable[initialCapacity + 1];
lastIndex = 0;
}
// 插入元素
public void add(T newEntry) {
// 代码如下
}
public T removeMax() {
// 代码如下
}
public T getMax() {
T root = null;
if (isEmpty())
root = heap[1];
return root;
}
public boolean isEmpty() {
return lastIndex < 1;
}
public int getSize() {
return lastIndex;
}
public void clear() {
for (; lastIndex > -1; lastIndex--)
heap[lastIndex] = null;
lastIndex = 0;
}
}
This chapter requires login to view full content. You are viewing a preview.
Login to View Full Content