二项树&&二项堆

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

二项树Bk的性质:

a、共有2k个结点

b、树的高度为k

c、在深度i处恰有Cki个结点,其中i=0,1,...,k

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

 

二项堆H由一组满足下列性质的二项树组成:

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

b、对任意非负整数k,在H中至多有一颗二项树的根具有度数k

在包含n个结点的二项堆H中,将n表示成二进制形式(有lgn+1位),当第i位为1时,说明二项树Bi出现在H中。

二项堆的数据结构:采用左孩子右兄弟的表示方式,每个结点有父域(p)、关键字域(key)、度域(degree)、最左孩子域(child)、紧右兄弟域(sibling),各二项树的根被组织成一个链表,称为根表,遍历根表时,各根的度数严格递增。head(H)指向H的根表中第一个元素。


创建一个新二项堆

 

create
1 MAKE-BINOMIAL-HEAP
2 head(H)=NULL

寻找最小关键字

 

minimum
 1 BINOMIAL-HEAP-MINIMUM(H)
2 y=NULL
3 x=head(H)
4 min=INFINITY
5 while(x!=NULL)
6 if(key(x)<min)
7 y=x
8 min=key(x)
9 x=sibling(x)
10 return y


合并两个二项堆

 

link
1 /*将以结点y为根的Bk-1树与以结点z为根的Bk-1树连接起来,使z成为y的父结点*/
2 BINOMIAL-TREE(y,z)
3 p(y)=z
4 sibling(y)=child(z)
5 child(z)=y
6 degree(z)=degree(z)+1

 

union
 1 BINOMIAL-HEAP-UNION(H1,H2)
2 H=MAKE-BINOMIAL-HEAP()
3 head(H)=BINOMIAL-HEAP-MERGE(H1,H2)
4 free H1 and H2
5 if(head(H)==NULL)
6 return Hujnh
7 prev=NULL
8 x=head(H)
9 next=sibling(x)
10 while(next!=NULL)
11 if(degree(x)!=degree(next) || (sibling(next)!=NULL&&degree(sibling(next))==degree(x)))
12 prev=x
13 x=next
14 else if(key(x)<=key(next))
15 sibling(x)=sibling(next)
16 BINOMIAL-HEAP-LINK(next,x)
17 else
18 if(prev==NULL)
19 head(H)=next
20 else
21 sibling(prev)=next
22 BINORMIAL-LINK(x,next)
23 x=next
24 next=sibling(x)
25 return H


merge
 1 BINORMIAL-HEAP-MERGE(H1,H2)
2 head(H)=NULL
3 x=head(H1)
4 y=head(H2)
5 if(x==NULL)
6 return y
7 if(y==NULL)
8 return x
9 if(degree(x)<degree(y))
10 head(H)=x
11 x=sibling(x)
12 else
13 head(H)=y
14 y=sibling(y)
15 z=head(H)
16 while(x!=NULL&&y!=NULL)
17 if(degree(x)<degree(y))
18 sibling(z)=x
19 x=sibling(x)
20 else
21 sibling(z)=y
22 y=sibling(y)
23 z=sibling(z)
24 while(x!=NULL)
25 sibling(z)=x
26 x=sibling(x)
27 z=sibling(z)
28 while(y!=NULL)
29 sibling(z)=y
30 y=sibling(y)
31 z=sibling(z)
32 return H
33

插入一个结点

 

insert
1 BINOMIAL-HEAP-INSERT(H,x)
2 H1=MAKE-BINOMIAL-HEAP()
3 p(x)=NULL
4 child(x)=NULL
5 sibling(x)=NULL
6 degree(x)=0
7 head(H1)=x
8 H=BINOMIAL-HEAP-UNION(H,H1)


减小关键字的值

 

decrease
 1 BINOMIAL-HEAP-DECREASE-KEY(H,x,k)
2 if(k>key(x))
3 return error "new key is greater than current key"
4 key(x)=k
5 y=x
6 z=p(y)
7 while(z!=NULL&&key(y)<key(z))
8 swap(key(y),key(z))
9 y=z
10 z=p(y)





posted @ 2012-02-17 13:04  Cavia  阅读(3003)  评论(0编辑  收藏  举报