栈、堆

五、栈

  • 设计方式两种:1. 顺序栈:通过数组实现; 2. 链式栈:通过链表实现。
  • 栈的特点:LIFO 先进后出 / FILO 先进先出
  • 栈的操作:
  1. Push
  2. Top
  3. Pop
  4. IsEmpty

六、堆

  • 堆的分类:

注意和二叉搜索树的区别:大顶堆不分左右大小,只要根是最大的,任何一个儿子都比它小,任何一个孙子小于其父亲(也就是当前结点的儿子)更小于祖父(图里的根结点),就是大根堆。同理,小根堆就是任何一个父亲都小于其任何一个儿子。

  • 堆的插入操作(以大根堆为例):

假如此时插入95,那我们的插入做法是将其作为结点10(层序遍历从0开始,从左向右从大到小遍历):

但是我们的堆是大顶堆,所以现在的插入位置显然是不合适的,就需要向上渗透,即让其与其父亲进行交换:

此时95比81大,那继续让其与其父结点81进行交换,结果如下:

继续比较95比91大,继续交换:

最后完成插入:

总而言之:

  • 插入新节点  -->  向上渗透
  • 删除根节点  -->  向下渗透
  • 堆的插入操作(以大根堆为例):

假设现在要删除根结点95了,堆的初始状态如下图所示:

不管最后一个结点的值是多少,都先删除根结点并将最后一个节点放到根结点的位置:

但是此时的更改使得其不满足大根堆的属性,我们需要在根结点放一个大的值,那么就要将根结点向下渗透,去和左右两个儿子进行比较,找出其中较大的儿子,如图95即为所求,那么就将这两个结点进行交换:

然后再将当前的节点的左右儿子结点进行比较,然后找最大的,然后交换:

然后继续比较,然后交换,直到找到了合适的位置:

  • 堆的应用:
  1. 优先队列
  2. 排序

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值