private static void BuildTree() { HuffmanTrees.Sort(); while (HuffmanTrees.Count > 1) { var parent = new HuffmanTree(); if (HuffmanTrees[0].Frequency > HuffmanTrees[1].Frequency) { HuffmanTrees.Sort(); } var min = HuffmanTrees[0]; var secondMin = HuffmanTrees[1]; if (parent.LeftChild == null) { parent.LeftChild = min; min.Parent = parent; HuffmanTrees.Remove(min); } if (parent.RightChild == null) { parent.RightChild = secondMin; secondMin.Parent = parent; HuffmanTrees.Remove(secondMin); } parent.Frequency = min.Frequency + secondMin.Frequency; HuffmanTrees.Insert(0, parent); } if (HuffmanTrees != null || HuffmanTrees[0].Parent == null) { Root = HuffmanTrees[0]; } }
public static SortedSet <string> Encode(string input) { HuffmanTrees = input .GroupBy(c => c) .Select(o => new HuffmanTree(o.Key, o.Count())) .OrderBy(n => n.Frequency) .ThenBy(n => n.Character).ToList(); Nodes = HuffmanTrees.ToArray <HuffmanTree>(); BuildTree(); Traverse(Root, 1); var set = new SortedSet <string>(); foreach (var c in input) { var code = Array.Find(Nodes, n => n.Character == c).Binary; set.Add(code); } return(set); }