Tree Construction
Algorithm
1. Create leaf node for each symbol with its frequency
2. Build priority queue with all nodes
3. While queue has more than one node:
a. Remove two nodes with lowest frequency
b. Create parent node with combined frequency
c. Add parent back to queue
4. Remaining node is root of Huffman treeImplementation
class HuffmanTree
def self.build(frequencies)
# Create priority queue
queue = frequencies.map { |symbol, freq|
Node.new(symbol, freq)
}.sort_by(&:frequency)
# Build tree
while queue.size > 1
left = queue.shift
right = queue.shift
parent = Node.new(nil, left.frequency + right.frequency)
parent.left = left
parent.right = right
queue << parent
queue.sort_by!(&:frequency)
end
queue.first
end
def generate_codes(node = @root, code = "", codes = {})
return codes if node.nil?
if node.leaf?
codes[node.symbol] = code
else
generate_codes(node.left, code + "0", codes)
generate_codes(node.right, code + "1", codes)
end
codes
end
endDecoding
def decode(bitstream, tree)
result = []
node = tree.root
until bitstream.eof?
bit = bitstream.read_bits(1)
node = bit == 0 ? node.left : node.right
if node.leaf?
result << node.symbol
node = tree.root # Reset to root
end
end
result
end