在堆中删除堆顶元素
删除元素之前先判断是否为空,如果未空则删除失败
在删除堆顶元素之后必须还是一颗完全二叉树,因为堆是由数组进行存储的所以直接删除数组的最后一个元素,不能保证还是一颗完全二叉树
因此将堆顶元素与堆尾元素交换,然后进行调整使其满足堆的约束条件
调整思想如下:
从根节点开始调整比较根节点值与左右孩子节点的值,
1如果根节点值为最大值则满足条件
2如果右孩子存在且最大值为右孩子,则将根节点与右孩子交换
3如果左孩子存在且最大值为左孩子,则将根节点与左孩子交换
上述2)3)中交换节点后还需要判断根节点右子树是否满足条件,所以需要一直往下调整,直到将最初根节点的值交换到最后一层上。
//在堆中删除一个元素 假设是大堆
105 void AdjustDown(Heap* heap, size_t size)
106 {
107 if(heap==NULL)
108 {
109 return ;
110