二叉堆:(堆)—>优先队列
- 结构性质:堆是一棵被完全堆满的二叉树,有可能的例外在底层,底层从左向右填入
- 堆序性质:(让操作快速执行的性质,所有操作保证始终保持堆序性质)【由于我们想要快速找出最小元,因此最小元应在根;如果考虑任意子树也是一个堆,那么任意节点应小于它的所有后裔】
完全二叉树:
- 高为h,则有2的h次方到2的(h+1)次方-1个节点
- N个节点,则高为LogN向下取整
完全二叉树满足二叉堆的结构性质,可以用一个数组存放:任意的位置i上的元素,其左儿子在2i,右儿子在2i+1,父节点在i/2向下取整
包含2的(h+1)次方-1个节点的理想二叉树的节点的高度和为2的(h+1)次方-1-(h+1)
插入:为了将X插入堆中,在下一个可用位置创建一个空穴,否则该堆将不是完全树
- 如果X可以放在该空穴,堆序性质不被破坏,那么插入完成
- 否则,将空穴的父节点上的元素放入该空穴,这样空穴就朝着根的方向冒;继续该过程直达X能被放入空穴中为止
删除:找出最小元是容易的,困难的是删除它
当删除一个最小元时,要在根建立一个空穴,由于现在堆中少了一个元素,因此堆中最后一个元素必须移到堆中的某一个位置
- 如果X而已被放在空穴中,则删除完成
- 一般第一种情况不太可能,因此将空穴的两个儿子中小的一个放在空穴中,这样就把空穴向下推了一层,继续该过直到X能被放入空穴为止