前置知识
堆是一个完全二叉树(最后一层可以不满,上面的每一层都是满的。一个结点若只有一个孩子结点,那一定是它的左孩子。如下图)这是一个逻辑上基于完全二叉树、物理上一般基于线性数据结构(如数组、向量、链表等)的一种数据结构。
完全二叉树最重要的性质:如果n个节点的完全二叉树的节点按照层次并按从左到右的顺序从0开始编号,对于人一个绩点都有:
序号为0的节点是根
对于 i > 0 i>0i>0,其父节点的编号为( i − 1 ) / 2 (i-1)/2(i−1)/2。
若 2 ⋅ i + 1 < n 2·i+1<n2⋅i+1<n ,其左子节点的序号为 2 ⋅ i + 1 2·i+12⋅i+1 ,否则没有左子节点。
若 2 ⋅ i + 2 < n 2·i+2<n2⋅i+2<n ,其右子节点的序号为 2 ⋅ i + 2 2·i+22⋅i+2 ,否则没有右子节点。
另外我们下边举例子根节点为数组下标为1的位子,相应的公式也会有点变化
堆的有序性
堆可分为两种:大根堆(最大堆)、小根堆(最小堆)。
大根堆
何为大根堆?顾名思义,大根堆即指在逻辑上的二叉树结构中,根结点>子结点,总是最大的,并且在堆的每一个局部都是如此。例如 3 , 1 , 2 {3,1,2}3,1,2 可以看作为大根堆,而 3 , 2 , 1 {3,2,1}3,2,1 亦可以看作为大根堆。大根堆的根结点在整个堆中是最大的元素。
小根堆
小根堆的性质与大根堆类似,只不过在二叉树的结构中,根结点<子结点。例如 1 , 2 , 3 {1,2,3}1,2,3 为小根堆,1 , 3 , 2 {1,3,2}1,3,2 同样也是小根堆。小根堆的根结点在整个堆中是最小的元素。