最小堆

最小堆

定义

每个节点的值都小于或者等于其子节点的值的完全二叉树。

数的基本操作是插入节点和删除节点。

插入操作

对最小堆而言,它们都很简单。为了将一个元素X插入最小堆,我们可以在树的下一个空闲位置创建一个空穴。如果X的可以放入空穴中而不破坏堆序,则插入完成。否则就执行上虑操作,即交换空穴和它的父节点上的元素。不断执行上述过程,直到X可以呗放入空穴,则插入操作完成。

删除操作 

最小堆的删除操作指的是删除其根节点上元素,并且不破坏堆序性质。执行删除操作时,我们需要现在根节点处创建一个空穴。由于堆现在少了一个元素,因此我们可以把堆的最后一个元素X移动到该堆的某个地方。如果X可以被放入空穴,则删除操作完成。否则就执行下虑操作,即交换空穴和它的两个儿子节点中的较小者。不断执行上述过程,直到X可以被放入空穴,则删除操作完成。

数组实现 

由于最小堆是一种完全二叉树,所以我们可以用数组来组织其中的元素。对于数组中的任意一个位置i上的元素,其左儿子节点在位置2i+1上,其右儿子节点在位置2i+2上,其父节点在位置(i-1)/2 上。与链表来表示堆相比,用数组表示堆不仅节省空间,而且更容易实现插入、删除等操作。

假设我们已经有一个包含N的元素的数组,现在要把它初始化为一个最小堆。那个最简单的方法是:初始化一个空堆,然后将数组中的每个元素插入该堆汇总。不过这样做的效率偏低。实际上,我们只需要堆数组中的第[(N-1)/2]~0个元素执行下虑操作,即可保证该数组构成一个最小堆。这是因为对包含N个元素的完全二叉树而言,它具有[(N-2)/2]个非叶子节点,这些非叶子节点正是该完全二叉树的第0~[(N-1)/2]个节点。我们只需要确保这些非叶子节点构成的子树都具有堆序性质,整个树就具有堆序性质。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

顾文繁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值