堆通常是一个可以被看做一棵树(完全二叉树)的数组对象。堆总是满足下列性质:

1.堆中某个节点的值总是不大于或不小于其父节点的值
2.堆总是一棵完全二叉树
3.将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆

完全二叉树
重新构建一种树, 专注于插入和删除最大或最小。 即, 根节点总是最大或最小且结构满足完全二叉树。 满足这种结构的树称为堆。如下图
树——最大堆,最小堆(4)
特点:
结构性: 用数组表示完全二叉树
有序性: 任一节点的关键字是其子树所有节点的最值(最大或最小) 。 最大值者,
称为最大堆, “最大堆(MaxHeap)” ,也称“大顶堆” 。 “最小堆(MinHeap)” ,也称
“小顶堆” 。如下图
树——最大堆,最小堆(4)
注: 从根节点到任意节点的路径上, 节点序列是有序的。

逻辑实现
插入:
最大堆的插入操作可以简单看成是“结点上浮”。 当我们在向最大堆中插入一个结
点我们必须满足完全二叉树的标准, 那么被插入结点的位置的是固定的。 而且要满足父
结点关键字值不小于子结点关键字值,那么我们就需要去移动父结点和子结点的相互位
置关系。如下图
树——最大堆,最小堆(4)

删除:
最大堆的删除操作, 总是从堆的根结点删除元素。 同样根元素被删除之后为了能够
保证该树还是一个完全二叉树, 我们需要来移动完全二叉树的最后一个结点, 让其继续
符合完全二叉树的定义, 从这里可以看作是最大堆最后一个结点的下沉。如下图
树——最大堆,最小堆(4)
此时满足完全二叉树的要求, 但是仍然不满足根节点是最大值的要求。所以继续调整,如下图:
树——最大堆,最小堆(4)
在已经确定的最大堆中做删除操作, 被删除的元素是固定的, 需要被移动的结点也
是固定的, 这里我说的被移动的元素是指最初的移动, 即最大堆的最后一个元素。 移动
方式为从最大的结点开始比较。

相关文章: