Java学习——数据结构(堆一)

若有看到这篇文章的小伙伴发现有内容错误,请告诉我改正。

一、堆

1)概念:堆是一种特殊的树。需要满足两个条件:

    ①树必须是完全二叉树。

    ②树的每个节点都必须大于等于(或小于等于)其左右子树任意一个节点的值。

2)分类:

①大顶堆:每个节点都必须大于等于其左右子树任意一个节点的值。

②小顶堆:每个节点都必须小于等于其左右子树任意一个节点的值。

3)存储结构:

主要是以顺序结构进行存储,即使用数组。

节点存放在i的位置,其左节点存放位置为2i,其右节点存放位置为2i+1。

4)堆化:

当向堆中插入元素就是向数组的数据末位添加,在添加完后要继续满足堆的两个特性,就需要继续进行调整,这个调整的过程称为堆化。

堆化有两种:从上往下、从下往上。

5)操作:

①插入:以大顶堆为例。步骤:

    ①将插入元素添加到堆的尾部,即将插入元素添加到数组的最后。

    ②进行堆化操作。具体为,将插入元素与尾部元素的父节点进行比较,若插入元素大于父节点,调换。

    ③继续执行步骤②,直至插入完成为止。

这里使用的堆化就是从下往上。

②删除堆顶元素:以大顶堆为例。步骤:

    ①将删除元素与堆中最后一个元素互换。

    ②除删除元素之外的所有元素进行堆化操作。

问题:如果不执行步骤①,之间进行步骤②会发生什么?

从图中可以看出,最后形成的树不是完全二叉树,那么它就不是堆。

正确删除:

6)时间复杂度:

堆操作的时间复杂度为O(logn)。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值