using System.Collections.Generic;
public abstract class HuffmanNode : IComparable<HuffmanNode>
public int Frequency { get {return frequency;} }
public HuffmanNode(int frequency)
this.frequency = frequency;
public int CompareTo(HuffmanNode other)
return frequency.CompareTo(other.Frequency);
public abstract void Print(int indent = 0, string code = "");
public class LeafHuffmanNode : HuffmanNode
public char Symbol { get {return symbol;} }
public LeafHuffmanNode(char symbol, int frequency) : base(frequency)
public override void Print(int indent, string code)
for (int i = 0; i < indent; i++) Console.Write(" ");
Console.WriteLine("{0} ({1}) code = {2}", Symbol, Frequency, code);
public class InternalHuffmanNode : HuffmanNode
private HuffmanNode left;
private HuffmanNode right;
public HuffmanNode Left { get {return left;} }
public HuffmanNode Right { get {return right;} }
public InternalHuffmanNode (HuffmanNode left, HuffmanNode right) : base (left.Frequency + right.Frequency)
public override void Print(int indent, string code)
left.Print(indent + 1, code + "0");
for (int i = 0; i < indent; i++) Console.Write(" ");
right.Print(indent + 1, code + "1");
public class HuffmanCoding
private HuffmanNode root;
public static Dictionary<char, int> CalculateFrequency (string str)
Dictionary<char, int> result = new Dictionary<char, int>();
if (result.ContainsKey(c))
public void BuildTree(Dictionary<char, int> freq)
PriorityQueue<HuffmanNode, int> queue = new PriorityQueue<HuffmanNode, int>();
foreach( KeyValuePair<char, int> kvp in freq )
LeafHuffmanNode node = new LeafHuffmanNode(kvp.Key, kvp.Value);
queue.Enqueue(node, node.Frequency);
HuffmanNode node1 = queue.Dequeue();
HuffmanNode node2 = queue.Dequeue();
InternalHuffmanNode newnode = new InternalHuffmanNode(node1, node2);
queue.Enqueue(newnode, newnode.Frequency);
Console.WriteLine("no tree");
public static void Main()
Dictionary<char, int> dict = HuffmanCoding.CalculateFrequency("aaaabbccd");
foreach( KeyValuePair<char, int> kvp in dict )
Console.WriteLine("Key = {0}, Value = {1}",
HuffmanCoding coder = new HuffmanCoding();