二项树
二项树Bk是一种递归定义的有序树。二项树B0只包含一个结点。二项树Bk由两个子树Bk-1连接而成:其中一棵树的根是另一棵树的根的最左孩子。
二项树Bk具有以下性质:1)共有2的k次方个结点
2)树的高度为k
3)在深度i处恰有k的i组合个结点,其中i=0,1,...,k
4)根的度数为k,它大于任何其他结点的度数,并且,如果对根的子女从左到右编号为k-1,k-2,...,0,子女i是子树Bi的根
二项堆
二项堆H由一组二项树构成,但需要满足下面两个性质:
1)H中的每个二项树遵循最小堆的性质:结点的关键字大于等于其父结点的关键字。
2)对于任意非负整数k,在H中至多有一棵二项树的根具有度数k。
二项堆常见操作:
插入:
往二项堆中插入一个元素,先创建一个只包含要插入元素的二项堆,再将此堆与原来的二项堆合并,实际上相当于把要插入的元素(
B0
二项树)丢到堆中,然后看堆中是否有其它B0二项树,如果有就将两颗B0二项树合并成一棵B1二项树,然后再看是否有其它的B1二项树,如果有则将其与新生成的B1二项树合并成B2二项树,以此类推。
查找最小关键字:
由于二项堆中的每个二项树都是最小堆,所以只需遍历所有二项树的根节点,时间复杂度为O(log
2
n)
减小或增大关键字的值:
如果增大关键字的值,只需不断与子节点比较,如果比子节点大则交换,直到叶节点为止。
如果减小关键字的值,只需不断与父节点比较,如果比父节点小则交换,直到根为止。
删除一个关键字(任何一个,不仅是根):
删除的原理非常简单,
把关键字减小,让它到达根节点
,然后删除最小值即可。下图展示了如何删除最小值1:
上图中,关键字1是二项树B4的根,删除1后,变成了4棵二项树:B0、B1、B2、B3,把这4棵树作为一个新堆,然后与原来的堆剩下的二项树合并。