图解二叉堆(最小堆&最大堆)

二叉堆

二叉堆是一颗完全二叉树,该树中的某个节点的值总是不大于(不小于)其左右子节点的值,包括最小堆和最大堆。可以通过下图理解,为什么会使用数组来保存呢?因为利用完全二叉树的性质,我们可以通过数组来表示完全二叉树(数组下标与完全二叉树节点存在映射关系,比如父节点可以通过Math.floor((index-1)/2)来获取、左子节点可以通过2index+1来获取、右子节点可以通过2index+2来获取,从而简化了实现及开销,避免使用额外的指针来实现树结构。

最小堆

最小(大)堆性质

  • 树根节点的值是所有堆节点值中最小(大)值。

  • 树中每个节点的子树也都是最小(大)堆。

最小(大)堆作用

最小(大)堆能保证堆顶元素为最小,而如果使用数组无法达到该效果。数组如果要访问最小值则需要遍历查找最小值,时间复杂度至少O(n)。而最小堆访问最小值时间复杂度为O(1),当然天底下没有免费的午餐,我们需要做额外的工作去维护最小(大)堆的结构,这也是需要复杂度花销的。

当然这也是最小(大)堆的优势,通过动态维护使得最小值的获取代价很小,实际上维护的时间复杂度为O(logN)。而数组则无法做到如此,如果数组想要维护顺序性则需要的复杂度至少为O(N)。这样来看最小(大)堆的优势就凸现出来了。

插入操作

为避免冗长累赘,我们这里只挑最小堆作为例子进行说明,最大堆的情况与最大堆相似。

现在分别插入4 7 2 5 6 1 0 3 8,使用一个数组来保存最小堆。为了帮助理解,数组下方提供一个逻辑上的完全二叉树的结构,两者结合着更容易理解其中机制。首先插入4。

image

接着插入7,插入后检测到树符合最小堆要求,所以不改动。

继续插入2,插入后检测到不符合最小堆要求,父节点4大于右子节点2。

于是将它们对调。

继续插入5,插入后检测到不符合最小堆要求,父节点7大于左子节点5。

于是将它们对调。

继续插入6,插入后检测到树符合最小堆要求,所以不改动。

继续插入1,插入后检测到不符合最小堆要求,父节点4大于左子节点1。

于是将它们对调。

对调后继续检测到不符合最小堆要求,父节点2大于右子节点1。

继续将它们对调。

继续插入0,插入后检测到不符合最小堆要求,父节点2大于右子节点0。

于是将它们对调。

对调后继续检测到不符合最小堆要求,父节点1大于右子节点0。

继续将它们对调。

继续插入3,插入后检测到不符合最小堆要求,父节点7大于左子节点3。

于是将它们对调。

对调后继续检测到不符合最小堆要求,父节点5大于左子节点3。

继续将它们对调,然后符合最小堆要求,不必继续往上对调。

继续插入8,插入后检测到树符合最小堆要求,所以不改动。以上,完成所有元素的最小堆插入操作。

min heap21

删除操作

删除操作其实就是删除最小值,即最小堆树中的根节点。主要是将树中最后一个手机号码拍卖节点替换到被删除的根节点,然后自顶向下递归调整使之符合最小堆要求。

删除根节点0,然后将树的最后一个节点8补到根节点上。

比较根节点的左右子节点。

因为右子节点1比较小,所以我们要进一步比较的是根节点8与右子节点1。

1小于8,于是对调。

继续比较现在节点8的左右子节点。

因为右子节点2比较小,所以我们要进一步比较的是根节点8与右子节点2。

2小于8,于是对调。

至此,完成最小值删除操作。

本公众号专注于人工智能、读书与感想、聊聊数学、计算机科学、分布式、机器学习、深度学习、自然语言处理、算法与数据结构、Java深度、Tomcat内核等。

作者简介:笔名seaboat,擅长人工智能、计算机科学、数学原理、基础算法。出版书籍:《Tomcat内核设计剖析》、《图解数据结构与算法》、《人工智能原理科普》。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
小堆和最大堆都是二叉树的一种特殊形式。最小堆是指每个节点的值都小于或等于其子节点的值,而最大堆则相反,每个节点的值都大于或等于其子节点的值。最小堆的删除操作是删除最小值,也就是删除根节点。具体的操作是将最后一个节点替换到根节点的位置,然后自顶向下递归调整以满足最小堆的要求。最大堆的删除操作是删除最大值,也是先将最后一个节点提到根节点的位置,然后删除最大值,并将新的根节点放到适当的位置。 最小堆和最大堆的优势是可以在常数时间内访问最小或最大值,而使用数组则需要遍历查找最小或最大值,时间复杂度至少为O(n)。但是,维护最小或最大堆的结构需要额外的工作,这也带来了复杂度的花销。总的来说,最小堆和最大堆是一种对数据进行快速查找的数据结构。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [图解叉堆(最小堆&最大堆)](https://blog.csdn.net/august5291/article/details/121120535)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [数据结构——最大堆最小堆](https://blog.csdn.net/qq_50675813/article/details/117753225)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值