11、堆的删除操作(中篇)

一、堆得删除操作的简单思路

1、首先我们判断堆是不是为空,然后获取我们的堆顶元素,和我们的最后一个元素,进行交换。

2、我们删除我们的最后一个元素,删除的元素,就是我们的堆顶元素,如果是最大堆,是最大元素,如果最小堆,就是最下元素。

3、我们对第一个元素,进行shift'Down操作。因为堆得定义,比如最大堆,就是堆中的任意节点都会下于等于它的父亲节点。我们第一个元素,必须进行和它的孩子节点比较,找到最大的元素替换它的位置,然后,继续向下走。知道满足堆得性质。

 

 // 看堆中的最大元素

    public T getMax() {
        if (size() == 0) {
            throw new IllegalArgumentException("堆中没有数据");
        }
        return data.get(0);
    }

    public T extractMax() {
        T res = getMax();
        data.swap(0,size()-1);   //交换第一个元素和最后一个元素
        data.removeLast(); //移除最后一个元素。
        shiftDown(0); //shiftDown第一个元素
        return res;
    }


    private void shiftDown(int i) {
        while(getLeftChild(i)<size()){   //首先默认
             int  j=getLeftChild(i);   //j 表示的是要找的元素
             if(j
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值