堆 01 基础

堆 - Heap

  • 也是一种树结构,最典型的实现就是基于二叉树实现的堆,称为二叉堆
  • 二叉堆是一颗完全二叉树
  • 完全二叉树不一定是满二叉树,不满的部分一定是在整个树的右下侧,即把元素一层一层的码在二叉树上;
  • 中某个节点的值总是不大于其父节点的值,这样的堆称为最大堆(相应的也可以定义出最小堆);
  • 中,上层节点的值不一定大于下层节点的值;
  • 由于二叉堆的节点是一层一层码在二叉树上的,一种很巧妙的实现方式是用数组,相关公式如下:
    • parent(i) = (i - 1) / 2;
    • left child(i) = 2 * i + 1;
    • right child(i) = 2 * i + 2;
  • 物理上存储堆的数组是有索引的,对应逻辑上的二叉树上每个节点也是有索引的,索引从0开始,从根节点开始,一层层的码下来;

最大堆的基础代码

  • 堆中元素的泛型要求能相互比较;
  • 3个私有方法用来获取给定索引的父节点的索引,左孩子的索引,右孩子的索引;
public class MaxHeap<E extends Comparable<E>> {

    private Array<E> data;

    public MaxHeap(int capacity){
        data = new Array<>(capacity);
    }

    public MaxHeap(){
        data = new Array<>();
    }

    // 返回堆中的元素个数
    public int size(){
        return data.getSize();
    }

    // 返回一个布尔值, 表示堆中是否为空
    public boolean isEmpty(){
        return data.isEmpty();
    }

    // 返回完全二叉树的数组表示中,一个索引所表示的元素的父亲节点的索引
    private int parent(int index){
        if(index == 0)
            throw new IllegalArgumentException("index-0 doesn't have parent.");
        return (index - 1) / 2;
    }

    // 返回完全二叉树的数组表示中,一个索引所表示的元素的左孩子节点的索引
    private int leftChild(int index){
        return index * 2 + 1;
    }

    // 返回完全二叉树的数组表示中,一个索引所表示的元素的右孩子节点的索引
    private int rightChild(int index){
        return index * 2 + 2;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值