Algorithm for Fibonacci Heap Operations
(from CLR text)
Make-Fibonacci-Heap()
n[H] := 0
min[H] := NIL
return H
Fibonacci-Heap-Minimum(H)
return min[H]
Fibonacci-Heap-Link(H,y,x)
remove y from the root list of H
make y a child of x
degree[x] := degree[x] + 1
mark[y] := FALSE
CONSOLIDATE(H)
for i:=0 to D(n[H])
Do A[i] := NIL
for each node w in the root list of H
do x:= w
d:= degree[x]
while A[d] <> NIL
do y:=A[d]
if key[x]>key[y]
then exchange x<->y
Fibonacci-Heap-Link(H, y, x)
A[d]:=NIL
d:=d+1
A[d]:=x
min[H]:=NIL
for i:=0 to D(n[H])
do if A[i]<> NIL
then add A[i] to the root list of H
if min[H] = NIL or key[A[i]]<key[min[H]]
then min[H]:= A[i]
Fibonacci-Heap-Union(H1,H2)
H := Make-Fibonacci-Heap()
min[H] := min[H1]
Concatenate the root list of H2 with the root list of H
if (min[H1] = NIL) or (min[H2] <> NIL and min[H2] < min[H1])
then min[H] := min[H2]
n[H] := n[H1] + n[H2]
free the objects H1 and H2
return H
Fibonacci-Heap-Insert(H,x)
degree[x] := 0
p[x] := NIL
child[x] := NIL
left[x] := x
right[x] := x
mark[x] := FALSE
concatenate the root list containing x with root list H
if min[H] = NIL or key[x]<key[min[H]]
then min[H] := x
n[H]:= n[H]+1
Fibonacci-Heap-Extract-Min(H)
z:= min[H]
if x <> NIL
then for each child x of z
do add x to the root list of H
p[x]:= NIL
remove z from the root list of H
if z = right[z]
then min[H]:=NIL
else min[H]:=right[z]
CONSOLIDATE(H)
n[H] := n[H]-1
return z
Fibonacci-Heap-Decrease-Key(H,x,k)
if k > key[x]
then error "new key is greater than current key"
key[x] := k
y := p[x]
if y <> NIL and key[x]<key[y]
then CUT(H, x, y)
CASCADING-CUT(H,y)
if key[x]<key[min[H]]
then min[H] := x
CUT(H,x,y)
Remove x from the child list of y, decrementing degree[y]
Add x to the root list of H
p[x]:= NIL
mark[x]:= FALSE
CASCADING-CUT(H,y)
z:= p[y]
if z <> NIL
then if mark[y] = FALSE
then mark[y]:= TRUE
else CUT(H, y, z)
CASCADING-CUT(H, z)
Fibonacci-Heap-Delete(H,x)
Fibonacci-Heap-Decrease-Key(H,x,-infinity)
Fibonacci-Heap-Extract-Min(H)