创建一个新二项堆
寻找最小关键字
最小关键字必在根节点中。
合并两个二项堆
反复连接根节点的度数相同的各二项树
第一阶段,将二项堆H1和H2的根表合并为一个链表H,它按度数排序成单调递增次序。
第二阶段,将相等度数的根连接起来,直到每个度数至多有一个根时为止。
情况1,degree[x]!=degree[next-x]。将指针指向下一个位置。
情况2,当x为具有相同度数的三个根中的第一个时发生,把三个相等度数的根中的第二个和第三个联合起来。
情况3和情况4,当x为具有相同度数的两个根中的第一个时发生。
情况3,key[x]<=key[next-x],故将next-x连接到x上。
情况4,next-x具有更小关键字,故x被连接到next-x上。
BINOMIA-HEAP-UNION的运行时间时间为O(lgn),其中n为二项堆H1和H2中总的结点数。
插入一个结点
构造一个只包含一个结点的二项堆H‘,再在O(lgn)时间内,将其与包含n个结点的二项堆H合并。
抽取具有最小关键字的结点
具有最小关键字的根x被从H的根表中去掉。x的各子女分别为B_{k-1},B_{k-2}...B_0树的根。
得到一个包含x树中除x外每个结点的二项堆H’。
合并H与H‘所得的结果二项堆包含原堆中除x的所有结点。
减小关键字的值
使关键字冒泡上升
删除一个关键字
使得结点x在整个二项堆中具有唯一的最小关键字,来使关键字及其卫星数据信息冒泡上升至树根。
将跟从H中去掉。
19.2-1 请写出BINOMIAL-HEAP-MERGE的伪代码。
19.2-2 请给出将关键字为24的结点插入图所示的二项堆后,所得的结果二项堆。
19.2-3 请给出将关键字为28的结点从图中的二项堆中删除后的结果。
19.2-4 讨论使用如下循环不变式时BINOMIAL-HEAP-UNION的正确性。
在while循环迭代开始时,x指向下列之一的根:
该度数下唯一的根;
该度数下仅有两根中的第一个;
该度数下仅有三个根中的第一个或第二个;
而且,根表中在x的前驱之前的所有根结点都有唯一度数,如果x的前驱的度数不同于x,则它在根表中的度数也是唯一的。最后,根表结点的顺序是按结点度数单调递增的。
19.2-5 如果关键字的值可能是OO,为什么过程BINOMIAL-HEAP-MINIMUM可能无法正确工作?重写代码使之正常工作。
19.2-6 假设无法表示出关键字-OO。重写BINOMIAL-HEAP-DELETE过程,使之在这种情况下能正确的工作。运行时间仍为O(lgn)。
19.2-7 讨论二项堆上的插入与一个二进制数增值的关系,以及合并两个二项堆与将两个二进制数相加之间的关系。
19.2-8 在不调用BINOMIAL-HEAP-UNION的前提下,重写INSERT,将一个结点直接插入一个二项堆中。
19.2-9 证明:如果将根表按度数排成严格递减序保存,仍可以在不改变渐进运行时间的前提下实现每一种二项堆操作。
19.2-10 找出使EXTRACT-MIN、DECREASE-KEY、DELETE、UNION的运行时间为Ω(lgn)的输入。解释为什么INSERT,MINIMUM的最坏运行时间是Ω^OO(lgn),而不是Ω(lgn)。