前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >二叉堆及java实现

二叉堆及java实现

作者头像
johnhuster的分享
发布2022-03-28 20:25:23
2770
发布2022-03-28 20:25:23
举报
文章被收录于专栏:johnhuster

基础知识

本文要讲的堆不是jvm内存结构中的堆,而是一种数据结构,在jdk的优先级队列就涉及到堆这种数据结构,堆可以分为大顶堆以及小顶堆两种。下面我们来看下大顶堆等效的二叉树结构,小顶堆类似,这里就不再赘述。

如上图所示,大顶堆的满足以下条件:

1、大顶堆等效构成的二叉树的父节点不小于其子节点

1、需要注意的是大顶堆以及小顶堆只关注每个节点与其子节点的大小,至于一个节点的子节点大小则不关注,即不是我们常说的二叉排序树。

2、上面的二叉树仅仅是大顶堆等效的一种结构,实际存储则是采用数组的形式,而不是二叉树的形式

实现

有了大顶堆的基础知识后,接下来看下如何用java实现大顶堆的构造

代码语言:javascript
复制
public class MaxHeap {

    @Test
    public void test(){
        int[] array= {2,8,14,4,16,7,1,10,9,3};
        buildMaxHeap(array);
        //输出构成的大顶堆
        for(int i:array){
            println(i);
        }
    }

    /**
     * 初始化大顶堆
     */
    private void buildMaxHeap(int[] array){
        for(int i= (array.length-2)/2;i>=0;i--){
            maxHeapify(array,i);
        }
    }
    /**
     *
     * @param arr
     * @param i
     */
    private void maxHeapify(int[] arr,int i){
        //println("i="+i);
        //有效数据下标从0开始
        int len = arr.length;
        //左子节点
        int left = 2*i+1;
        //右子节点
        int right = 2*i+2;
        //初始化最大值节点为当前节点
        int largest = i;
        //左节点不超出数组范围且比较大节点值大,则更新较大值下标
        if(left <len && arr[left] > arr[largest]){
            //左节点比该节点大
            largest = left;
        }
        //右节点不超出数组范围且比较大节点值大,则更新较大值下标
        if(right <len && arr[right] > arr[largest]){
            //左节点比该节点大
            largest = right;
        }
        //如果子节点有一个比当前节点大,则进行数据呼唤,同时向下递归
        if(largest != i){
            //交换节点i与较大子节点数据
            swap(arr,i,largest);
            //经过上面的调整后节点i与其两个子节点满足大顶堆条件
            //但是需要判断调整后的节点largest位置以及其子节点是否还满足大顶堆特性
            maxHeepify(arr,largest);
        }
    }

    private void swap(int[] arr,int i,int j){
        int tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }
}

上面例子对应的完全二叉树结构就如本文第一张图所示。

PS:

1、maxHeapify方法的时间复杂度为O(lgn)

2、buildMaxHeap的时间复杂度为O(n)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/03/18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 基础知识
  • 实现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档