概念
结构特点
堆(数据结构)
- 逻辑上:完全二叉树
- 物理上:数组
堆是一种顺序存储结构(采用数组方式存储),仅仅是利用完全二叉树的顺序结构的特点进行分析。
结点下标计算公式(根节点从0开始)
已知二叉树根结点的下标是root,那么它左孩子的下标left=2root+1,右孩子的下标right=2root+2。
已知孩子结点的下标(不区分左右)为child,那么双亲的下标为(child-1)/2。
如果从1开始,则已知root,则左孩子节点left=2root+1,right=2root+2。已知child,则其根结点root=child/2.
堆的定义和性质
- 小堆 满足根的值小于等于所有子树结点的值;
- 大堆 根的值大于等于所有子树结点的值。
堆的向上,向下调整算法
堆的向下调整算法,当需要调整的节点的左右子树均为大根堆或者小根堆时,就可以使用向下调整算法,通过比较和交换, 让以该节点为首的堆成为一个大根堆或者小根堆。
void AdjustDown(int* a, int root, int n) {
//建立小堆
int parent = root;
int child = parent*2+1;
while (child < n){
if (child + 1 < n && a[child] > a[child+1])