二叉堆

性质是一棵完全二叉树(不同于满二叉树)堆中每一个节点的值总是不大于其父节点的值,也称最大堆(相应的也可以定义最小堆)要注意的是,即使是最大堆,也并不意味着上一层的每个节点的值都大于下一层的节点值。这里16虽然在17的上层,但值小于17由于二叉堆是完全二叉树,因此完全可以使用数组来构建树,由上往下,由左往右,依次编号数组的索引,这里建议根节点编号1。通过这种方式,我们不仅可以构建二叉堆...
摘要由CSDN通过智能技术生成

性质

  • 是一棵完全二叉树(不同于满二叉树
  • 堆中每一个节点的值总是不大于其父节点的值,也称最大堆(相应的也可以定义最小堆

要注意的是,即使是最大堆,也并不意味着上一层的每个节点的值都大于下一层的节点值。
这里16虽然再17的上层,但值小于17

这里16虽然在17的上层,但值小于17

由于二叉堆是完全二叉树,因此完全可以使用数组来构建树,由上往下,由左往右,依次编号数组的索引,这里根节点可以编号0,也可以编号1(本文采取编号1)。通过这种方式,我们不仅可以构建二叉堆,还可以很轻松地得到每个节点的子节点和父节点的位置。第i个节点的父节点、左右子节点可以由以下的计算式推导得出:

parent(i) = i / 2;
leftChild = i * 2;
rightChild = i * 2 + 1;

操作

基本代码

由于其需要满足最大堆的特性,因此每个元素都需要有比较,在此继承Comparable。

public class MaxHeap<E extends Comparable<E>> {
   
    private ArrayList<E> data;

    public MaxHeap(int capacity) {
   
        data = new ArrayList<>(capacity);
        data.add(null);//因为本文采用从1开始序列
    }

    public MaxHeap() {
   
        data = new ArrayList<>();
        data.add(null);//因为本文采用从1开始序列
    }

    public int size() {
   
        return data.size() - 1;
    }

    public boolean isEmpty() {
   
        return size() == 0;
    }

    //获取父节点索引
    private int parent(int index) {
   
        if (index == 1) {
   
            throw new IllegalArgumentException("root doesn't have parent");
        }
        return index / 2
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值