0
点赞
收藏
分享

微信扫一扫

小顶堆的实现Java

小顶堆是一种常见的数据结构,它是一棵完全二叉树,满足每个父节点的值都小于或等于其子节点的值。在Java中,实现小顶堆可以使用数组来表示,其中每个元素的索引位置与二叉树的节点位置相对应。在本文中,我将为你介绍如何实现小顶堆。

实现小顶堆的流程

首先,我们来看一下实现小顶堆的流程。下面是一个展示了该流程的表格:

步骤 描述
1 创建一个空的数组,用于存储堆元素
2 实现插入操作,将元素插入到堆中
3 实现删除堆顶元素操作,将堆顶元素删除
4 实现堆化操作,维持堆的性质

接下来,我会详细介绍每一步需要做什么,以及相应的代码实现。

代码实现

首先,我们需要创建一个空的数组来存储堆元素。可以使用Java的ArrayList来实现,具体代码如下所示:

List<Integer> heap = new ArrayList<>();

接下来,我们来实现插入操作。插入操作的步骤如下:

  1. 将新元素添加到数组的末尾。
  2. 将新元素上移,直到满足小顶堆的性质。

下面是实现插入操作的代码:

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);  // 将新元素插入到正确的位置
}

接下来,我们来实现删除堆顶元素操作。删除堆顶元素的步骤如下:

  1. 将堆顶元素与数组末尾元素交换位置。
  2. 删除数组末尾元素。
  3. 将新的堆顶元素下移,直到满足小顶堆的性质。

下面是实现删除堆顶元素操作的代码:

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;  // 更新索引为最小子节点的索引
举报

相关推荐

0 条评论