二叉树——堆

Posted maider

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树——堆相关的知识,希望对你有一定的参考价值。

一、堆的性质

  结构性:用数组表示的完全二叉树

  有序性:任意一结点的关键字是其子树所有结点的最大值(或最小值)

二、最大堆的操作

1、创建一个空的最大堆,堆从下标为1的地方开始存放(根结点下标为1)

技术图片

2、最大堆的插入

首先,把要插入的结点放在数组的末尾,假设下标为H->size + 1

再将它与父结点比较,如果它比父结点大,两者互换位置

直到它比父结点小,这时候下标为0的很大的元素起到了哨兵作用。

技术图片

3、最大堆的删除:删除最大的元素,然后再调整剩余结点,使其仍然是一个最大堆

把最大堆的最后一个元素a挪到根结点

找出a现在的左右儿子中较大的那个

如果a比左右儿子中较大的那个要小

互换位置

继续比较a与左右儿子中较大的那个

直到a比左右儿子都要大

技术图片

4、最大堆的建立:将N个元素按最大堆的要求存储在一维数组中

方法1:一个一个插入,效率较低

方法2:在线性时间复杂度下建立最大堆

    (1)将N个元素按输入顺序存入,先满足完全二叉树的结构特性

    (2)调整各结点位置,以满足最大堆的有序性

 技术图片              技术图片

一个结点,左子树是一个最大堆,右子树是一个最大堆

从删除操作,我们已经知道如何将他们三者调成一个最大堆

那么现在我们可以倒过来,逐步建立最大堆

下图中,p表示结点——左子树——右子树模型中结点的下标

H表示完全二叉树,一开始不是最大堆,但执行完PerDown后是最大堆

技术图片

 

以上是关于二叉树——堆的主要内容,如果未能解决你的问题,请参考以下文章

堆的简单学习

重温堆排序

数据结构13—二叉搜索树,堆

手写一个二叉堆

二叉堆

JavaScript数据结构与算法 - 二叉堆和堆排序