其他分享
首页 > 其他分享> > 堆-原理到应用——用最简单的代码让你读懂堆

堆-原理到应用——用最简单的代码让你读懂堆

作者:互联网

堆-原理到应用

文章目录

堆的介绍

.\images\05.png .\images\06.png

堆的实现

如何存储一个堆

堆的存储是使用数组实现的,下标从0开始从左至右从上到下,依次递增,例如上述的小根堆存储在数组中就是

[1, 2, 3, 4, 5, 6, 7]

对应的下标为 0 , 1 , 2 , 3 , 4 , 5 , 6 0, 1, 2, 3, 4, 5, 6 0,1,2,3,4,5,6

如何将一个数组变成一个堆

从最后一个有孩子节点 (节点下标为 M M M)的元素开始,先将以改元素为根节点的子树变成一个堆,然后下标减 1 1 1,再将下标为 M − 1 M - 1 M−1的节点所对应的子树变成堆,依次递减进行,知道根节点。示例如下(以小根堆为例):

.\images\08.png

从上面的图可以知道,当 1 1 1和 7 7 7互换之后,子树 [ 7 , 2 , 5 ] [7, 2, 5] [7,2,5]不是一颗小根堆了,那怎么办?再将子树 [ 7 , 2 , 5 ] [7, 2, 5] [7,2,5]变成小根堆即可,所以再进行一次小根堆操作即可,将 7 7 7, 2 2 2进行互换即可,交换之后的结果为:

.\images\13.png

在上述的树中,交换过程已经完成了,但是如果节点的数目非常大,或者说下面的子树可能又出现了不符合小根堆的情况怎么办?那就一直循环走下去,直到没有孩子节点或者已经满足小根堆的性质。

以上就是将一个完全二叉树变成一颗小根堆的过程,大根堆的过程非常类似,即将较大的数作为父亲节点即可,就不在进行陈述~~~

标签:子树,下标,代码,读懂,二叉树,互换,原理,小根堆,节点
来源: https://blog.csdn.net/qq_45537774/article/details/114858420