一、概念
1.可合并堆
(1)可合并堆应支持的操作
MAKE-HEAP()
INSERT(H, x)
MINIMUM(H)
EXTRACT-MIN(H)
UNION(H1, H2)
(2)二项堆是一种可合并堆
2.二项树
(1)二项树的定义
二项树是Bk一种递归定义的有序树
B0只包含一个结点
Bk(k>0)由两棵二项树B|k-1连接而成,其中一棵作为另一棵的左孩子
(2)二项树Bk的性质
a.共有2^k个结点
b.树的高度为k
c.在深度i处恰有C(i, k)个结点
d.树的度数为k,它大于任何其它结点的度;并且,如果根的子女从左到右编号为k-1, k-1, ……, 0,子女i是子树Bi的根
(3)二项树的结构
用左孩子用兄弟的方法表示二项树
(4)二项树的举例
3.二项堆
(1)二项堆的定义与性质
(2)二项堆的结构
(3)二项堆提供的操作
二、代码
Binomial_Heap.h
#include <iostream>
using namespace std;
//二项堆结点结构
struct node
{
int key;//关键字
int data;//卫星数据
node *p;//指向父结点的指针,父或左兄
node *child;//指向左孩子的指针
node *sibling;//指向右兄弟的指针
int degree;//度
//初始化
node(int n, node *nil):key(n),p(nil),child(nil),sibling(nil),degree(0){}
};
//二项堆结构
class Binomial_Heap
{
public:
node *head;
node *nil;
//构造函数
Binomial_Heap(){nil = new node(-1, nil);}
Binomial_Heap(node *NIL){nil = NIL;}
//19.2
void Make_Binomial_Heap();
node* Binomial_Heap_Minimum();
void Binomial_Link(node *y, node *z);
node *Binomial_Heap_Merge(Binomial_Heap *H1, Binomial_Heap *H2);
void Binomial_Heap_Union(Binomial_Heap *H2);
void Binomial_Heap_Insert(node *x);
node* Binomial_Heap_Extract_Min();
void Binomial_Heap_Decrease_Key(node *x, int k);
void Binomial_Heap_Delete(node *x);
};
//构造一个空的二项堆
void Binomial_Heap::Make_Binomial_Heap()
{
//初始化对象
head = nil;
}
//寻找最小关键字
node* Binomial_Heap::Binomial_Heap_Minimum()
{
//最小关键字一定位于某个二项树的根结点上
node *x = head, *y = nil;
int min = 0x7fffffff;
//遍历每个二项树的根结点
while(x != nil)
{
//找出最小值
if(x->key < min)
{
min = x->key;
y = x;
}