二项树与二项堆

来源:互联网 发布:access2007数据库引擎 编辑:程序博客网 时间:2024/05/22 07:03

二项树

二项树Bk是一种递归定义的有序树。二项树B0只包含一个结点。二项树Bk由两个子树Bk-1连接而成:其中一棵树的根是另一棵树的根的最左孩子。

二项树

二项树Bk具有以下性质:

1)共有2的k次方个结点

2)树的高度为k

3)在深度i处恰有k的i组合个结点,其中i=0,1,...,k

4)根的度数为k,它大于任何其他结点的度数,并且,如果对根的子女从左到右编号为k-1k-2,...0,子女i是子树Bi的根


二项堆

二项堆H由一组二项树构成,但需要满足下面两个性质:

1H中的每个二项树遵循最小堆的性质:结点的关键字大于等于其父结点的关键字。

2)对于任意非负整数k,在H中至多有一棵二项树的根具有度数k

二项堆

二项堆常见操作:
插入:
往二项堆中插入一个元素,先创建一个只包含要插入元素的二项堆,再将此堆与原来的二项堆合并,实际上相当于把要插入的元素(B0二项树)丢到堆中,然后看堆中是否有其它B0二项树,如果有就将两颗B0二项树合并成一棵B1二项树,然后再看是否有其它的B1二项树,如果有则将其与新生成的B1二项树合并成B2二项树,以此类推。
查找最小关键字:
由于二项堆中的每个二项树都是最小堆,所以只需遍历所有二项树的根节点,时间复杂度为O(log2n)
减小或增大关键字的值:
如果增大关键字的值,只需不断与子节点比较,如果比子节点大则交换,直到叶节点为止。
如果减小关键字的值,只需不断与父节点比较,如果比父节点小则交换,直到根为止。
删除一个关键字(任何一个,不仅是根):
删除的原理非常简单,把关键字减小,让它到达根节点,然后删除最小值即可。下图展示了如何删除最小值1:

上图中,关键字1是二项树B4的根,删除1后,变成了4棵二项树:B0、B1、B2、B3,把这4棵树作为一个新堆,然后与原来的堆剩下的二项树合并。
0 0
原创粉丝点击