Idea: Merge the two lowest-frequency nodes (leaf or internal) into a new
node until every leaf has been considered.
Use a priority queue Q to keep nodes ordered by frequency.
Huffman(c) ; Analysis
n = |c| ; Q is a binary heap
Q = c ; O(n) BuildHeap
for i = 1 to n-1 ; O(n)
z = Allocate-Node()
x = Extract-Min(Q) ; O(lgn) O(n) times
y = Extract-Min(Q) ; O(lgn) O(n) times
left(z) = x
right(z) = y
f(z) = f(x) + f(y)
Insert(Q,z) ; O(lgn) O(n) times
return Extract-Min(Q) ; -----------------