The implicit representation of a complete binary tree as an array,
or list, seems to have been first proposed by Eytzinger [27].
He used this representation in books containing pedigree family trees
of noble families. The
data structure described here was
first introduced by Williams [76].
The randomized
data structure described here appears
to have first been proposed by Gambin and Malinowski [34].
Other meldable heap implementations exist, including
leftist heaps [16,48, Section 5.3.2],
binomial heaps [73],
Fibonacci heaps [30],
pairing heaps [29], and skew heaps [70],
although none of these are as simple as the
structure.
Some of the above structures also support a
operation
in which the value stored at node
is decreased to
. (It is a
pre-condition that
.) In most of the preceding structures,
this operation can be supported in
time by removing node
and adding
. However, some of these structures can implement
more efficiently. In particular,
takes
amortized time in Fibonacci heaps and
amortized time in a special version of pairing heaps [25].
This more efficient
operation has applications in
speeding up several graph algorithms, including Dijkstra's shortest path
algorithm [30].
Exercise 10..1
Illustrate the addition of the values 7 and then 3 to the

shown at the end of Figure
10.2.
Exercise 10..2
Illustrate the removal of the next two values (6 and 8) on the

shown at the end of Figure
10.3.
Exercise 10..3
Implement the

method, that removes the value stored in
![$ \mathtt{a[i]}$](img215.png)
in a

. This method should run in

time.
Next, explain why this method is not likely to be useful.
Exercise 10..4
A

-ary tree is a generalization of a binary tree in which each
internal node has

children. Using Eytzinger's method it is also
possible to represent complete

-ary trees using arrays. Work out
the equations that, given an index

, determine the index of

's
parent and each of

's

children in this representation.
Exercise 10..5
Using what you learned in Exercise
10.4, design and
implement a

, the

-ary generalization of a

. Analyze the running times of operations on a

and test the performance of your

implementation against
that of the

implementation given here.
Exercise 10..6
Illustrate the addition of the values 17 and then 82 in the

shown in Figure
10.4. Use a coin to
simulate a random bit when needed.
Exercise 10..7
Illustrate the removal of the next two values (4 and 8) in the

shown in Figure
10.4. Use a coin to
simulate a random bit when needed.
Exercise 10..8
Implement the

method, that removes the node

from
a

. This method should run in

expected time.
Exercise 10..9
Show how to find the second smallest value in a

or

in constant time.
Exercise 10..10
Show how to find the

th smallest value in a

or

in

time. (Hint: Using another heap
might help.)
Exercise 10..11
Suppose you are given

sorted lists, of total length

. Using
a heap, show how to merge these into a single sorted list in

time. (Hint: Starting with the case

can be instructive.)
opendatastructures.org