Java利用完全二叉树创建大根堆和小根堆

 更新时间:2022年08月08日 16:15:09   作者:陈亦康  
大根堆是每个结点的值不大于他的父亲结点的值;小根堆是每个结点的值不小于他的父亲结点的值。本文将利用完全二叉树创建大根堆和小根堆,感兴趣的可以了解一下

大根堆

大根堆:每个结点的值不大于他的父亲结点的值

分析如下:

假设对{ 27,15,19,18,28,34,65,49,25,37 }这样一个集合的数据创建成堆;

 

 

代码如下:

//建立大根堆
public class TestHeap{
    public int[] array;
    public int usedSize;//当前有效数组长度
    public TestHeap(){
        this.array = new int[10];
        this.usedSize = 0;
    }
    //初始化数组
    public void InitArray(int[] arrayClone){
        array = Arrays.copyOf(arrayClone, arrayClone.length);
        usedSize = array.length;
    }
    //创建大根堆
    public void createHeap(){
        for(int parent = (usedSize - 1 - 1) / 2; parent >= 0; parent--){
            adjustment(parent, usedSize);
        }
    }
    //调整
    public void adjustment(int parent, int len){
        //左子树结点下标
        int child = parent * 2 + 1;
        //调整
        while(child < len){
            //先判断有没有右孩子,如果右,找出最大值
            if(child + 1 < len && array[child] < array[child + 1]){
                child++;//如果右子树大,child++就指向他,如果左子树大,就不用管,直接进行下一步判断交换
            }
            //若左右子树的最大值大于父亲结点则交换
            if(array[child] > array[parent]){
                swap(array, child, parent);
                parent = child;
                child = parent * 2 + 1;
            } else{
                break;
            }
        }
    }
    //交换
    public void swap(int[] array, int child, int parent){
        int tmp = array[child];
        array[child] = array[parent];
        array[parent] = tmp;
    }
}

小根堆

小根堆:每个结点的值不小于他的父亲结点的值

分析与大根堆类似,只是比较出更小的进行替换

代码如下:

//建立大根堆
public class TestHeap{
    public int[] array;
    public int usedSize;//当前有效数组长度
    public TestHeap(){
        this.array = new int[10];
        this.usedSize = 0;
    }
    //初始化数组
    public void InitArray(int[] arrayClone){
        array = Arrays.copyOf(arrayClone, arrayClone.length);
        usedSize = array.length;
    }
    //创建大根堆
    public void createHeap(){
        for(int parent = (usedSize - 1 - 1) / 2; parent >= 0; parent--){
            adjustment(parent, usedSize);
        }
    }
    //调整
    public void adjustment(int parent, int len){
        //左子树结点下标
        int child = parent * 2 + 1;
        //调整
        while(child < len){
            //先判断有没有右孩子,如果右,找出最小值
            if(child + 1 < len && array[child] > array[child + 1]){
                child++;//如果右子树小,child++就指向他,如果左子树小,就不用管,直接进行下一步判断交换
            }
            //若左右子树的最大值小于父亲结点则交换
            if(array[child] < array[parent]){
                swap(array, child, parent);
                parent = child;
                child = parent * 2 + 1;
            } else{
                break;
            }
        }
    }
    //交换
    public void swap(int[] array, int child, int parent){
        int tmp = array[child];
        array[child] = array[parent];
        array[parent] = tmp;
    }
}

到此这篇关于Java利用完全二叉树创建大根堆和小根堆的文章就介绍到这了,更多相关Java大根堆 小根堆内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • gRPC中interceptor拦截器的使用教程

    gRPC中interceptor拦截器的使用教程

    gRPC中的interceptor拦截器分为客户端拦截器和服务端拦截器,分别是在客户端和服务端的请求被发送出去之前进行处理的逻辑,下面就跟随小编一起学习一下interceptor拦截器的具体使用吧
    2023-08-08
  • Java设计模式的事件模型详解

    Java设计模式的事件模型详解

    这篇文章主要为大家详细介绍了Java设计模式的事件模型,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • SpringBoot可视化监控的具体应用

    SpringBoot可视化监控的具体应用

    最近越发觉得,任何一个系统上线,运维监控都太重要了,本文介绍了SpringBoot可视化监控的具体应用,分享给大家,有兴趣的同学可以参考一下
    2021-06-06
  • 若依框架多数据源切换方式

    若依框架多数据源切换方式

    这篇文章主要介绍了若依框架多数据源切换方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • SpringBoot框架打包体积简化过程图解

    SpringBoot框架打包体积简化过程图解

    这篇文章主要介绍了SpringBoot框架打包体积简化过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • SpringBoot的依赖管理配置

    SpringBoot的依赖管理配置

    一般来讲SpringBoot项目是不需要指定版本,而SSM项目是需要指定版本,SpringBoot的核心依赖就是spring-boot-starter-parent和spring-boot-starter-web两个依赖,关于这两个依赖的相关介绍具体今天小编给大家介绍下
    2022-07-07
  • springboot实现获取当前服务器IP及当前项目使用的端口号Port

    springboot实现获取当前服务器IP及当前项目使用的端口号Port

    这篇文章主要介绍了springboot实现获取当前服务器IP及当前项目使用的端口号Port方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • 详解java 中的CAS与ABA

    详解java 中的CAS与ABA

    这篇文章主要介绍了java 中的CAS与ABA的相关资料,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下
    2021-05-05
  • 详解Java分布式IP限流和防止恶意IP攻击方案

    详解Java分布式IP限流和防止恶意IP攻击方案

    这篇文章主要介绍了详解Java分布式IP限流和防止恶意IP攻击方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • 一文详解Java抽象类到底有多抽象

    一文详解Java抽象类到底有多抽象

    这篇文章主要介绍了一文详解Java抽象类到底有多抽象,抽象方法所在的类必须是抽象类,子类若继承了一个抽象类,就必须覆写父类的所有抽象方法,这里的子类是普通类,是强制要求覆写所有抽象方法,但是如果子类也是一个抽象类,那么就可以不覆写
    2022-06-06

最新评论