Ted 带你学习数据结构 之 二叉堆(Binary Heap)

版权声明:Hi,屏幕前的猿你好,此篇博文中的内容如帮到你,请一定不能吝啬帮我点赞,评论,关注,帮我来个全套大保健呢!我愿与你一同成长变强,得到技术加持,祈愿! https://blog.csdn.net/ted_cs/article/details/82915976

二叉堆(Binary Heap)

(1)structure property

Heap(堆)是一个除了底层节点外的完全填满的二叉树,底层可以不完全,左到右填充节点。(a heap is a binary tree that completely filled, with the exception of bottom level, which is filled from left to right.)这样的树叫做完全二叉树。

完全二叉堆的通俗解释为: 上层节点全满时,下层才能有节点;且下层节点必须是从左往右添加的。

一个高度为h 的完全二叉树应该有以下的性质:

a) 有2^h到2^h-1个节点

b) 完全二叉树的高度为[logN](向下取整)

此时注意,当N为2的多次方时,h=logN+1;

c)他的左子节点在2*i,右子节点在(2*i+1)

d) 它的父节点在【i/2】(向下取整)

二叉堆是一种逻辑上的数据结构,而它是由数组来实现的。

下图显示了完全二叉树与数组的对应关系:

在这里插入图片描述

在这里插入图片描述

(2)heap order property

有两种结构:最大堆和最小堆。
最大堆:父结点的键值总是大于或等于任何一个子节点的键值;最小堆:父结点的键值总是小于或等于任何一个子节点的键值。示意图如下:

图3

java里面,大家熟知的Queue接口中的PriorityQueue,它就是最小堆最好的例子。

其实从这里可以看出,堆的两条性质:(a)完全二叉树;(b)父节点小于后继子节点

(3)堆的操作

  • 插入

如果要在二叉堆中插入或删除一个元素,必须保证堆性质仍能满足。

新插入的节点new 放在完全二叉树最后的位置,再和父节点比较。如果new节点比父节点小,那么交换两者。交换之后,继续和新的父节点比较…… 直到new节点不比父节点小,或者new节点成为根节点。这样得到的树,就恢复了堆的性质。

4

图 5

  • 删除

删除操作一定是踢出数组的第一个元素(即根节点),这么来第一个元素以前的位置就成了空位,让最后一个节点 last成为新的节点,从而构成一个新的二叉树。再将last节点不断的和子节点比较。如果last节点比两个子节点中小的那一个大,则和该子节点交换。直到last节点不大于任一子节点都小,或者last节点成为叶节点。

图 6

图 7

End!


本篇内容基本上转自以下不同博文节选部分。 感恩这些博主,提供很多思路去理解二叉堆。

二叉堆(一)之 图文解析 和 C语言的实现

堆结构的优秀实现类----PriorityQueue优先队列

Priority Queue(Heaps)–优先队列(堆)

二叉堆

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/ted_cs/article/details/82915976