美文网首页算法
二叉堆的构建以及添加/删除实现

二叉堆的构建以及添加/删除实现

作者: just_like_you | 来源:发表于2019-07-17 23:54 被阅读0次

二叉堆的学习记录,实现的过程以及源码

每个根节点都大于或等于子节点的完全二叉树称为大顶锥,每个根节点都小于或等于子节点的完全二叉树称为小顶锥,大顶锥的锥顶就是整个树的最大值,小顶锥则是最小值,由于是完全二叉树,所以底层使用的物理数据结构为数组实现。

  • 从末尾添加,二叉堆要使用上浮操作来完成自调节
  • 从锥顶删除,将最末尾元素替换锥顶,然后开始下沉操作完成自调节
  • 构建二叉锥,则是使用从最大的非子叶节点依次下沉完成自调节
上浮 : 将元素与其父节点比较,若小于,则保存替换。到索引值小于0或者大于等于父节点的时候停止,再使用保存的值替换当前子节点即可。其中,获取父节点的索引和子节点的关系
int parentIndex = (childIndex-1)/2

下沉 : 将元素与左右子节点中较小的进行比较,若大于,则保存替换,到索引值大于树长度-1或者不大于较小节点结束,然后替换父节点即可。其中父节点和子节点的关系是:

int childIndex = 2 * parentIndex + 1;

构建heap的非子叶节点的最大索引值和树的长度关系为:

int maxIndex = (arr.length -2 )/2;

源码如下

/**
 * @author hj
 * 2019-07-17 22:44
 * 关于二叉堆的测试类
 */
public class BinaryTreeHeapTest {


    public static void main(String[] args) {
        int[] arr = {1, 3, 2, 6, 5, 7, 8, 9, 10, 0};
        upAdjust(arr);
        System.out.println(Arrays.toString(arr));

        int[] arr1 = {0, 1, 2, 3, 5, 6, 7, 8, 9, 10};
        buildHeap(arr);
        System.out.println(Arrays.toString(arr1));
    }

    /**
     * 上浮调整
     *
     * @param arr 二叉堆
     */
    public static void upAdjust(int[] arr) {
        int lastIndex = arr.length - 1;
        int parentIndex = (lastIndex - 1) / 2;
        int tmp = arr[lastIndex];
        while (arr[parentIndex] > tmp && lastIndex > 0) {
            //这里只是单纯的赋值即可,在最后上浮结束完成交换
            arr[lastIndex] = arr[parentIndex];

            //获取下一轮的索引
            lastIndex = parentIndex;
            parentIndex = (parentIndex - 1) / 2;
        }
        arr[lastIndex] = tmp;
    }

    /**
     * 下沉调整
     *
     * @param arr         要调整的堆
     * @param parentIndex 下沉的父节点的索引
     */
    public static void downAdjust(int[] arr, int parentIndex) {
        int length = arr.length;
        int tmp = arr[parentIndex];
        int childIndex = 2 * parentIndex + 1;
        while (childIndex < length) {

            //获取左右节点中最小值索引
            if (childIndex + 1 < length && arr[childIndex + 1] < arr[childIndex]) {
                childIndex++;
            }

            //小于左右节点中最小值则退出
            if (tmp <= arr[childIndex]) {
                break;
            }

            arr[parentIndex] = arr[childIndex];
            parentIndex = childIndex;
            childIndex = 2 * childIndex + 1;

        }
        //下沉结束
        arr[parentIndex] = tmp;
    }

    /**
     * 构建二叉堆
     *
     * @param arr 带构建的二叉树
     */
    public static void buildHeap(int[] arr) {
        for (int i = (arr.length - 2) / 2; i >= 0; i--) {
            downAdjust(arr, i);
        }
    }
}

添加和删除逻辑直接在上浮下沉逻辑之前简单构建二叉堆数组即可,简单就不记录了。

相关文章

  • 二叉堆的构建以及添加/删除实现

    二叉堆的学习记录,实现的过程以及源码 每个根节点都大于或等于子节点的完全二叉树称为大顶锥,每个根节点都小于或等于子...

  • 用go实现二叉堆插入删除构建

    二叉堆的插入: 二叉堆的删除: 二叉堆的构建:

  • 堆排序的实现

    使用大顶锥实现升序排序,二叉堆的详细操作见以前的文章 步骤如下: 先构建大顶堆 然后循环删除堆顶元素(交互首尾元素...

  • 堆-Heap

    堆-Heap 堆的基本接口设计 二叉堆(最大堆) 大顶堆-添加 大顶堆-删除 删除堆顶元素的同时插入一个新元素 大...

  • 堆排序

    思路: 1、把无序数组构建成最大二叉堆2、循环删除堆顶元素,移到集合尾部,调节堆产生新的堆顶 当我们删除一个最大堆...

  • Groovy实现BTree的构建,插入,删除,查询以及遍历

    Groovy实现BTree的构建,插入,删除,查询以及遍历 运行结果:

  • 7天练|Day5:二叉树和堆

    关于二叉树和堆的7个必知必会的代码实现二叉树实现一个二叉查找树,并且支持插入、删除、查找操作实现查找二叉查找树中某...

  • 二叉堆与优先队列(二)

    前言 在上一篇中简单介绍了二叉堆和优先队列的概念,说明了二叉堆是使用一颗完全二叉树来实现的,并且在插入元素和删除元...

  • 08_平衡二叉搜索树

    二叉搜索树在添加、删除节点时,都可能会导致二叉搜索树退化成链表,为了防止二叉搜索树退化成链表,让添加、删除、搜索的...

  • [数据结构与算法-iOS 实现]二叉堆原理实现及top k 问题

    二叉堆 demo 二叉堆其实就是一颗完全二叉树,所以又可以叫做完全二叉堆 二叉堆的底层可以用数组来实现 对于二叉堆...

网友评论

    本文标题:二叉堆的构建以及添加/删除实现

    本文链接:https://www.haomeiwen.com/subject/ykmhlctx.html