[路飞]堆的基本知识

288 阅读2分钟

堆是什么?

堆并不是我们计算机系统里面的堆栈(简指存储空间),本篇文章主要指的是数据结构与算法中的数据结构“堆”。

堆是什么呢?我们不得不复习一下我们之前学过的二叉树的一种,“完全二叉树”。

完全二叉树

完全二叉树必须要符合,编号为i的子节点,左孩子节点编号为 2 * i,右孩子节点编号为 2 * i + 1

完全二叉树可以用连续的存储空间存储 即 一个如下样式的二叉树

image.png

可以用

image.png

这样的方式存储在数据结构中。

而堆呢,则是在完全二叉树的基础上继续规则完备

堆主要分为两种形式,大顶堆和小顶堆

大顶堆

示例如下,父节点元素一定大于子节点元素。

image.png

小顶堆

示例如下:父节点元素一定小于子节点元素

image.png

堆的常见操作

我们学习数据结构与算法的主要目的是为了学习一些不同的思维方式。

常见的数据结构的学习分为: 结构定义 + 结构操作

我们只需要对一种性质进行定义并维护这种性质,即达到了我们学习某种数据结构的目标。

我们来了解一下堆的操作。

堆的常见操作有两种,和队列一样,顶部出队,尾部插入。

尾部插入

如下图,我们定义了一个左侧的堆,是可以以右侧的形式来进行线性存储的

image.png

假设我们需要在尾部插入一个数据13,那么我们将13放在数组的最后一个位置,即7元素的子节点位置。

这时候我们会发现堆不再符合大顶堆或者小顶堆的性质,我们要对其进行参数调整。

13 与 父元素节点进行对比,大于父亲元素节点,则交换位置

image.png

继续对比

image.png

直到最后

image.png

至此,尾部插入操作完成。

头部弹出

弹出操作我们要怎么做呢?

首先从最顶部弹出顶部元素,然后再下级补位,取下级元素中最大的元素,依次向上补位。

弹出调整是一个至上而下的调整。

示例如下:

我们有一个顶部元素为13的大顶堆。

image.png

将顶部元素出队,然后下级补位

image.png

下级下级依次序向上补位

image.png

直到操作完成

image.png

以上就是堆的基本概念以及基本操作的思想描述,欢迎各位大佬评论区拍砖~~