什么是二叉堆
定义:二叉堆,本质上是一种完全二叉树。
分类:二叉堆分为最大堆和最小堆两种类型。最大堆中,任何一个父节点的值都大于或等于它的左、右孩子节点的值;最小堆中,任何一个父节点的值都小于或等于它的左、右孩子节点的值。
二叉堆的根节点叫做堆顶。因此,最大堆的堆顶是整个堆中的最大元素,最小堆的堆顶是整个堆中的最小元素。
二叉堆的基本操作
二叉堆的基本操作也是二叉堆的自我调整,有插入节点、删除节点和构建二叉堆。
1.插入节点
二叉堆要插入一个节点时,总是插在完全二叉树的最后一个位置。插入过程为:
若在最小堆中插入一个节点,则插入节点后与父节点进行比较,若小于父节点则将该节点“上浮”,然后继续与父节点比较,重复操作,直到稳定(即满足最小堆中的所有父节点大于等于其左右节点),最后堆顶节点元素必定是最小的元素。在最大堆中插入节点,则是当大于父节点时“上浮”,最后的堆顶元素必定是最大的元素。
由于每次插入操作,都是单一节点在进行浮动,因此,插入操作的时间复杂度是O(logn)
2.删除节点
二叉堆要删除一个节点时,总是删除堆顶的节点。删除过程为:
若在最小堆中删除一个节点,我们移除堆顶的节点,并将堆中的最后一个节点临时补到原本堆顶的位置,然后将堆顶节点与其左右节点进行比较,如果其中最小的一个比堆顶节点小,则将堆顶节点“下沉”,然后继续与左右节点进行比较,重复操作,直到稳定。在最大堆中删除一个节点时,则是将左右节点中大的那个,并且比父节点还大的那个节点进行移动,将父节点“下沉”,重复操作,直到稳定。
由于删除节点操作,是单一节点的“下沉”,因此,删除操作的时间复杂度为O(logn)
3.构建二叉堆
构建二叉堆,就是把一个无序的完全二叉树调整为二叉堆,本质上就是让所有非叶子节点依次“下沉”(构建最小堆)。
如下图所示,依次将2,8,3,6节点进行下沉操作,顺序如下所示。
节点“3”需要继续下沉:
构建二叉堆的时间复杂度为O(n),这里就不进行数学推理了。