二叉堆的插入和删除
二叉堆是完全二元树或者是近似完全二元树,一般用数组来表示。它分为最大堆和最小堆。最大/最小堆是指:父结点的键值总是大于/小于或等于任何一个子节点的键值。
本文件的2个函数分别给出最大二叉堆bheap的插入insert_max_heap 和删除delete_max_heap。 (验证时间约 155sec)
其中,堆的"第一个元素(根节点)"放在bheap[1],父节点和子节点的位置关系如下:
(1) 索引为i的左孩子的索引是 (2*i), 即bheap[i]左=bheap[2*i];
(2) 索引为i的右孩子的索引是 (2*i+1), 即bheap[i]右=bheap[2*i+1];
(3) 索引为i的父结点的索引是 floor(i/2), 即bheap[i]父=bheap[i/2];
二叉堆的插入:
在数组bheap的最末尾插入新节点x。然后自下而上调整子节点与父节点:比较当前节点与父节点,不满足堆性质则交换,直至当前子树满足二叉堆的性质。
二叉堆的删除:
把数组bheap的最后那个节点移到被删除的(在这里最大值=根节点)节点处,作为父节点。然后再从上而下调整父节点与它的子节点:
对于最大堆,父节点如果小于子节点,则交换二者。直至当前节点与它的子节点满足堆性质为止。
验证特点:量化断言,\old
标注说明:本文件有二个函数,分别是二叉堆(最大堆)的插入(任意值)和删除(最大值=根节点)。
函数前条件:给出堆的大小和函数入口处当前二叉堆的性质;
函数后条件:插入或者删除元素后,二叉堆长度+1或-1,二叉堆性质保持不变。