二叉堆的性质
- 父节点的键值总是大于等于(或小于等于)字节点的键值
- 父节点的键值总是大于等于的堆叫做最大堆,反之叫最小堆
堆的存储形式
- 下图中任何一个点 i,其父节点的下标是 (i-1)/2
- 点i的两个子节点的下标分别是 2i+1 与 2i+2
堆的操作 - 插入删除
- 在数组结尾增加一个元素: 先在对应位置插入元素,再重新对堆排序
- 删除第一个元素:先删除元素,然后将剩下来的堆重新排序
在数组结尾增加一个元素
void MinHeapFixup(int a[], int i)
{
int j, temp;
/*--------------先将数组末尾的元素储存起来--------------*/
/*--------------再找到这个位置对应父节点*/
temp = a[i];
j = (i - 1) / 2;
while (j >= 0 && i != 0)
{
if (a[j] <= temp)
break;
a[i] = a[j]; //把较大的子结点往下移动,替换它的子结点
i = j;
j = (i - 1) / 2;
}
a[i] = temp;
}