堆和二叉堆的实现和特性

二叉堆:通过完全二叉树(不是二叉搜索树)
完全二叉树就是它的根和每一级节点都是满的,除了最小面一层的叶子可能不满
用二叉搜索树也可以实现堆(也可以,但是慢了,二叉搜索树,整体是有序的,可以找最小值,也可以找最大值,同时增加删除也是LogN,但是二叉搜索树找最小值就不是O(1)的就变成LogN了,因为要遍历这个树,找到最左边的叶子节点)

二叉堆(大顶)满足性质

1 是一颗完全树
2 树种任意节点的值总是 >= 其子节点的值 (保证根节点就是最大的值

二叉堆实现细节(二叉堆通过数组实现)

假设”第一个元素”在数组中的索引为0的话,则父节点和子节点位置关系如下:
1 索引为i的左孩子的索引是(2i + 1);
2 索引为i的左孩子的索引是(2
i + 2);
3 索引为i的父节点的索引是floor((i-1)/2)
在这里插入图片描述

Inset插入操作

1 新元素一律先插入到堆的尾部
2 依次向上调整整个堆的结构(一直到根即可) 重新维护堆:把新元素挪到堆相应的位置
HeapifyUp
插入的节点跟父亲节点相比较,大于父亲节点进行交换,直到走到根 满足堆的性质

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
树的深度是logN所以最多也是调换logN次就到达了.

删除最大元素(堆顶)

1 将堆尾元素替换到顶部(即堆顶被替代删除掉)
2 依次从根部向下调整整个堆的结构(一直到堆尾即可),根部左儿子与右儿子比较,将最大的与根节点换
HeapifyDown
在这里插入图片描述
注意:二叉堆是堆(优先 队列priority_queue)的一种常见且简单的实现,
但并不是最优的实现

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值