最小堆的建立 插入 与删除

本文深入讲解堆数据结构的原理,包括完全二叉树的特点、如何在数组中实现堆、建堆、删除和插入操作的详细步骤及代码实现,以及调整函数的设计。分析了堆操作的时间复杂度为logn。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

堆是完全二叉树,完全二叉树最大的特点就是 把数据储存在数组里 通过父子结点的关系来做  不用实际建树  parent=leftchild/2; leftchild=2*parent  右就加1这儿指的是序号关系,储存的时候注意是利用树的逻辑图 从上到下 从左到右编号12345....。


建堆:实际是把数据先放入数组(注意下标从1开始),对应逻辑图,写调整代码,我的基本思路是从数组末尾开始,对应元素与其父节点比较,满足条件就换值,并且对被换的调用调整函数(要单独写个调整函数)因为被换的一个是可能不满足堆的要求的。然后一个while循环这样的操作一直做到第2个元素.一个最小堆或最大堆就可以了

删除操作:把数组最后元素替换第一个,把最后一个赋个特殊值。然后调用调整函数就OK。这样的好处是数组中实际的元素保持连续的,方便操作,而且代码简单。

插入操作;同理和删除差不多,把插入的数放在数组最后(这种方法很好),调用调整函数。

 

调整函数:接收元素下标,判断它的左儿子和右儿子(通过下标关系很好找)大小,把满足条件的换上来,对被换的继续调用调整函数递归直到被换的元素满足条件,大于或小于左右儿子。细节注意数组越界等问题。

一个插入和删除操作的时间约等于调用函数的时间复杂度,调用函数最多递归树的高度次也就是logn(n个结点),那么时间这三种操作的时间复杂度就是logn。

转载于:https://www.cnblogs.com/-Finch-/p/7208581.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值