数据结构——优先级队列——二叉堆


发布于 2016-07-11 / 27 阅读 / 0 评论 /
二叉堆是一种优先级队列

1.二叉堆概述

二叉堆是一种优先级队列。

1.1.优先级队列

优先级队列中,进入队列的结点必须具备优先级,结点优先级越高出队越早,结点优先级越低出队越晚,优先级相同者,则按照先进先出的原则处理。

优先级队列结点之间的关系由结点的优先级决定,而不是由入队的先后顺序决定的。

普通队列是以先进先出原则维护的,结点之间的关系由入队的先后顺序决定。

1.2.二叉堆定义

基于二叉树结构组织而成的优先级队列,就称为二叉堆。

二叉堆可以使入队和出队操作在最坏情况下时间复杂度为O(logN)。

1.3.二叉堆特性

结构性和有序性是二叉堆的两个基本特性。

1.3.1.结构性

二叉堆具有树形结构,是一颗完全二叉树。

1.3.2.有序性

任何结点都要小于(或大于)它的子孙结点。

2.二叉堆分类

二叉堆有两种表现形态。

2.1.最小二叉堆

当根结点是最小元素,且树中所有结点都小于它的子孙结点,则称为最小化堆。

最小化堆例如下图所示:

根结点为2,是树中最小的元素。

2.2.最大二叉堆

当根结点是最大元素,且树中所有结点都大于它的子孙结点,则称为最大化堆。

最大化堆例如下图所示:

根结点为30,是树中最大的元素。

3.二叉堆运算

二叉堆支持的基本运算与普通队列相同。主要就是出堆和入堆。

3.1.deQueue

出堆是一种向下过滤的方式。

以最大化堆的出堆为例。

(1)将根结点30出堆

(2)将最后一个结点3移到根结点,开始向下过滤

(3)当前结点与子结点比较,找到最大值,最大元素与当前结点相互进行位置转移

3和25进行转移

(4)当前结点与子结点比较,找到最大值,最大元素与当前结点相互进行位置转移

将3和23进行转移。

当前结点如果满足顺序,或者当前结点没有子结点,则循环结束,向下过滤完成。

3.2.enQueue

入堆是一种向上过滤的方式。

以最小化堆的出堆为例。

(1)新增一个元素1,放入最后的结点

(2)向上过滤,如果父结点比当前结点小,则进行位置替换。

将结点1和23进行替换

(3)向上过滤,如果父结点比当前结点小,则进行位置替换。

将结点1和结点3进行位置转移

(4)向上过滤,如果父结点比当前结点小,则进行位置替换。

将结点1和结点2进行位置转移。

如果当前结点为根结点,或者与父结点比较后没有进行位置替换,则循环结束,向上过滤完成。