二项堆

在计算机科学中，二项堆（binomial heap）是一种类似于二叉堆的堆结构。与二叉堆相比，其优势是可以快速合并两个堆，因此它属于可合并堆（mergeable heap）抽象数据类型的一种。

二项堆的操作

由于并不需要对二项树的根结点进行随机存取，因而这些结点可以存成链表结构。

合并

最基本的为二个度数相同的二项树的合并。由于二项树根结点包含最小的关键字，因此在二棵树合并时，只需比较二个根结点关键字的大小，其中含小关键字的结点成为结果树的根结点，另一棵树则变成结果树的子树。
function mergeTree(p, q)
    if p.root <= q.root
        return p.addSubTree(q)
    else
        return q.addSubTree(p)

两个二项堆的合并则可按如下步骤进行：度数从小取到大，在两个二项堆中如果其中只有一棵树的度数为，即将此树移动到结果堆，而如果只两棵树的度数都为，则根据以上方法合并为一个度数为的二项树。此后这个度数为的树将可能会和其他度数为的二项树进行合并。因此，对于任何度数j，可能最多需要合并3棵二项树。
此操作的时间复杂度为。
function merge(p, q)
    while not (p.end() and q.end())
        tree = mergeTree(p.currentTree(), q.currentTree())
        
        if not heap.currentTree().empty()
            tree = mergeTree(tree, heap.currentTree())
        
        heap.addTree(tree)
        heap.next(); p.next(); q.next()

插入

创建一个只包含要插入元素的二项堆，再将此堆与原先的二项堆进行合并，即可得到插入后的堆。由于需要合并，插入操作需要的时间。平摊分析的时间复杂度为。

查找最小关键字所在结点

由于满足最小堆性质，只需查找二项树的的根结点即可，因为一共有棵子树，所以用所时间为。
可以保存一个指向最小元素的指针，使得查找最小关键字所在结点需要的时间。在执行其他操作时，需要修改该指针。

删除最小关键字所在结点

先找到最小关键字所在结点，然后将它从其所在的二项树中删除，并获得其子树。将这些子树看作（合并为）一个独立的二项堆，再将此堆合并到原先的堆中即可。由于每棵树最多有棵子树，创建新堆的时间为。同时合并堆的时间也为，故整个操作所需时间为。
function deleteMin(heap)
    min = heap.trees().first()
    for each current in heap.trees()
        if current.root < min then min = current
    for each tree in min.subTrees()
        tmp.addTree(tree)
    heap.removeTree(min)
    merge(heap, tmp)

减小特定结点(关键字)的值(Decreasing a key)

在减小特定结点（关键字）的值后，可能会不满足最小堆积性质。此时，将其所在结点与父结点交换，如还不满足最小堆性质则再与祖父结点交换……直到最小堆性质得到满足。操作所需时间为。

删除

将需要删除的结点的关键字的值减小到负无穷大（比二项堆中的其他所有关键字的值都小即可），执行“减小关键字的值”算法，使其调整到当前二项树的根节点位置，再删除最小关键字的根结点即可。