博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
二叉堆构建
阅读量:4134 次
发布时间:2019-05-25

本文共 2273 字,大约阅读时间需要 7 分钟。

二叉堆本质上一种完全二叉树,分为:最小堆和最大堆,二叉堆的根结点叫做堆顶

最大堆:最大堆的任何一个父节点的值都大于或等于他的左右节点的值,最大堆的堆顶是整个堆中最大元素
最小堆:最小堆的任何一个父节点的值都小于或等于他的左右节点的值,最小堆的堆顶是这个堆中最小元素
二叉堆的几种操作:
1、插入节点:插入位置是完全二叉树的最后一个位置;堆的插入操作是单一节点的“上浮”,平均交换次数都是堆高度的一半,所以时间复杂度是O(logn)
2、删除节点:删除的是处于堆顶的节点;堆的删除操作是单一节点的“下沉”,平均交换次数都是堆高度的一半,所以时间复杂度是O(logn)
3、构建二叉堆:就是将一个完全无序的二叉树调整为二叉堆,本质上就是让所有非叶子结点依次“下沉”;时间复杂度是O(n)
 

/** * 二叉堆构建 */public class Adjust {    /**     * "上浮"调整     *     * @param arr     */    public static void upAdjust(int[] arr) {        if (arr == null) {            return;        }        int childIndex = arr.length - 1;        int parentIndex = (childIndex - 1) / 2;        //保存插入的叶子结点的值,用于最后的赋值        int temp = arr[childIndex];        while (childIndex > 0 && temp < arr[parentIndex]) {            //无须真正交换,单向赋值即可            arr[childIndex] = arr[parentIndex];            childIndex = parentIndex;            parentIndex = (parentIndex - 1) / 2;        }        arr[childIndex] = temp;    }    /**     * "下沉"调整     *     * @param arr         待调整值     * @param parentIndex 待下沉的父节点     * @param length      堆的有效大小     */    public static void downAdjust(int[] arr, int parentIndex, int length) {        int temp = arr[parentIndex];        int childIndex = parentIndex * 2 + 1;        while (childIndex < length) {            //如果有右孩子,且右孩子小于左孩子则定位到右孩子            if (childIndex + 1 < length && arr[childIndex + 1] < arr[childIndex]) {                childIndex++;            }            //如果父节点小于任何一个孩子的值,直接退出            if (temp < arr[childIndex]) {                break;            }            //无须交换,单向赋值即可            arr[parentIndex] = arr[childIndex];            parentIndex = childIndex;            childIndex = 2 * childIndex + 1;        }        arr[parentIndex] = temp;    }    /**     * 构建堆     *     * @param arr     */    public static void buildHeap(int[] arr) {        //从最后一个非叶子节点开始,依次做下沉操作        for (int i = (arr.length - 2) / 2; i >= 0; i--) {            downAdjust(arr, i, arr.length);        }    }    public static void main(String[] args) {        int[] arr = new int[]{1, 3, 2, 6, 5, 7, 8, 9, 10, 0};        upAdjust(arr);        System.out.println(Arrays.toString(arr));        arr = new int[]{7, 1, 3, 10, 5, 2, 8, 9, 6};        buildHeap(arr);        System.out.println(Arrays.toString(arr));    }}

 

转载地址:http://bqsvi.baihongyu.com/

你可能感兴趣的文章
OpenFeign学习(六):OpenFign进行表单提交参数或传输文件
查看>>
Ribbon 学习(二):Spring Cloud Ribbon 加载配置原理
查看>>
Ribbon 学习(三):RestTemplate 请求负载流程解析
查看>>
深入理解HashMap
查看>>
XML生成(一):DOM生成XML
查看>>
XML生成(三):JDOM生成
查看>>
Ubuntu Could not open lock file /var/lib/dpkg/lock - open (13:Permission denied)
查看>>
collect2: ld returned 1 exit status
查看>>
C#入门
查看>>
C#中ColorDialog需点两次确定才会退出的问题
查看>>
数据库
查看>>
nginx反代 499 502 bad gateway 和timeout
查看>>
linux虚拟机安装tar.gz版jdk步骤详解
查看>>
python实现100以内自然数之和,偶数之和
查看>>
python数字逆序输出及多个print输出在同一行
查看>>
苏宁产品经理面经
查看>>
百度产品经理群面
查看>>
去哪儿一面+平安科技二面+hr面+贝贝一面+二面产品面经
查看>>
element ui 弹窗在IE11中关闭时闪现问题修复
查看>>
vue 遍历对象并动态绑定在下拉列表中
查看>>