小顶堆是一种常见的数据结构,它是一棵完全二叉树,满足每个父节点的值都小于或等于其子节点的值。在Java中,实现小顶堆可以使用数组来表示,其中每个元素的索引位置与二叉树的节点位置相对应。在本文中,我将为你介绍如何实现小顶堆。
实现小顶堆的流程
首先,我们来看一下实现小顶堆的流程。下面是一个展示了该流程的表格:
步骤 | 描述 |
---|---|
1 | 创建一个空的数组,用于存储堆元素 |
2 | 实现插入操作,将元素插入到堆中 |
3 | 实现删除堆顶元素操作,将堆顶元素删除 |
4 | 实现堆化操作,维持堆的性质 |
接下来,我会详细介绍每一步需要做什么,以及相应的代码实现。
代码实现
首先,我们需要创建一个空的数组来存储堆元素。可以使用Java的ArrayList来实现,具体代码如下所示:
List<Integer> heap = new ArrayList<>();
接下来,我们来实现插入操作。插入操作的步骤如下:
- 将新元素添加到数组的末尾。
- 将新元素上移,直到满足小顶堆的性质。
下面是实现插入操作的代码:
public void insert(int num) {
heap.add(num); // 将新元素添加到数组的末尾
int index = heap.size() - 1; // 获取新元素的索引
while (index > 0) {
int parent = (index - 1) / 2; // 获取父节点的索引
if (heap.get(parent) <= num) {
break; // 如果父节点的值小于等于新元素,跳出循环
}
heap.set(index, heap.get(parent)); // 将父节点的值下移
index = parent; // 更新索引为父节点的索引
}
heap.set(index, num); // 将新元素插入到正确的位置
}
接下来,我们来实现删除堆顶元素操作。删除堆顶元素的步骤如下:
- 将堆顶元素与数组末尾元素交换位置。
- 删除数组末尾元素。
- 将新的堆顶元素下移,直到满足小顶堆的性质。
下面是实现删除堆顶元素操作的代码:
public int deleteMin() {
if (heap.isEmpty()) {
throw new NoSuchElementException("Heap is empty.");
}
int min = heap.get(0); // 获取堆顶元素
int last = heap.remove(heap.size() - 1); // 移除数组末尾元素
if (!heap.isEmpty()) {
heap.set(0, last); // 将末尾元素放到堆顶
int index = 0; // 开始下移的索引
int size = heap.size(); // 堆的大小
while (index < size) {
int left = 2 * index + 1; // 左子节点的索引
int right = 2 * index + 2; // 右子节点的索引
if (left >= size) {
break; // 如果左子节点的索引超出堆的大小,跳出循环
}
int minChild = left; // 默认最小子节点为左子节点
if (right < size && heap.get(right) < heap.get(left)) {
minChild = right; // 如果右子节点小于左子节点,最小子节点为右子节点
}
if (heap.get(minChild) >= last) {
break; // 如果最小子节点的值大于等于末尾元素,跳出循环
}
heap.set(index, heap.get(minChild)); // 将最小子节点上移
index = minChild; // 更新索引为最小子节点的索引