还不会优先级队列(堆)?图解PriorityQueue

目录

1.二叉树的顺序存储

1.1存储方式:

1.2下标的关系:

2.堆(优先级队列)

2.1堆的概念

2.2堆的操作-向下调整

2.3堆的操作-建堆

2.4堆的操作-入队列

2.5堆的操作-出队列


1.二叉树的顺序存储

1.1存储方式:

使用数组保存二叉树结构,其方式就是将二叉树用层序遍历的方式存入数组当中,一般只适合表示

完全二叉树,因为非完全二叉树会有空间浪费的现象;而堆在逻辑上就是一颗完全二叉树,堆也正是保

存在数组当中的,所以堆的保存方式就是将堆进行层序遍历然后存储在数组当中.

1.2下标的关系:

已知父亲节点(parent)的下标;则有

左孩子(left)的下标=2*parent+1;

右孩子(right)的下标=2*parent+2;

已知孩子节点(child)(不区分左右)的下标;则有

父亲节点(parent)下标=(child-1)/2;

2.堆(优先级队列)

2.1堆的概念

  1. 堆逻辑上是一棵完全二叉树
  2. 堆物理上是保存在数组当中
  3. 满足任意节点的值都大于其子树中节点的值,叫大根堆
  4. 满足任意节点的值都小于其子树中节点的值,叫小根堆
  5. 堆的基本作用是,快速找到集合中的最值 

2.2堆的操作-向下调整

        前提:左右子树必须已经是一个堆,才能进行向下调整

        说明: 1. array 代表存储堆的数组

                    2. size 代表数组中被视为堆数据的个数

                    3. index 代表要调整位置的下标

                    4. left 代表 index 左孩子下标

                    5. right 代表 index 右孩子下标

                    6. min 代表 index 的最小值孩子的下标

        向下调整的过程(以小堆为例):

                1.index如果已经是叶子节点,则整个调整过程结束

                          1.1 判断index位置有没有孩子

                          1.2 因为堆是完全二叉树,若没有左孩子就一定没有右孩子,

                                所以只需判断是否有左孩子

                           1.3 因为堆的存储结构是数组,所以判断是否有左孩子的时候,

                                  就等于判断左孩子对应的下标是否越界

                2.确定left 或right,谁是index的最小孩子min

                            2.1 如果右孩子不存在,则min=left

                            2.2  比较 array[left] 和 array[right] 值的大小,选择小的为min

                3.比较array[index] 和 array[min] 的值,如果 array[index] <= array[min],则满足   

                    小根堆的要求,调整结束

                4.否则,交换 array[index] 和 array[min] 的值

                5.因为min位置的堆的性质可能会被破坏,所以把min当作index,向下重复以上过程

 以下是图解:

                    

 

 

代码:

2.3堆的操作-建堆

        建堆:从倒数的第一个非叶子节点的子树开始调整,一直 调整到根节点的树,就可以调整

                成堆。

       以下为建立大根堆为例:代码如下:

        

 

 

2.4堆的操作-入队列

                过程(以大堆为例):

                1. 首先按尾插方式放入数组

                2. 比较其和其父亲节点的值的大小,如果父亲节点的值大,则满足堆的性质,插入结束                 3. 否则,交换其和父亲节点位置的值,重新进行 2、3 步骤 4. 直到根结点

代码:

 

图示: 

2.5堆的操作-出队列

为了防止破坏堆的结构,删除时并不是直接将堆顶元素删除,而是用数组的最后一个元素替换堆顶元素,然后通过向 下调整方式重新调整成堆.

代码:

希望以上内容对您理解优先级队列有所帮助喔! 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值