public static HuffmanTree Build(Dictionary <string, int> Frequencies) { HuffmanTree tree = new HuffmanTree(); foreach (KeyValuePair <string, int> symbol in Frequencies) { tree.nodes.Add(new Node() { Symbol = symbol.Key, Frequency = symbol.Value }); } while (tree.nodes.Count > 1) { List <Node> orderedNodes = tree.nodes.OrderBy(node => node.Frequency).ToList <Node>(); if (orderedNodes.Count >= 2) { // Take first two items List <Node> taken = orderedNodes.Take(2).ToList <Node>(); // Create a parent node by combining the frequencies Node parent = new Node() { Symbol = "*", Frequency = taken[0].Frequency + taken[1].Frequency, Left = taken[0], Right = taken[1] }; tree.nodes.Remove(taken[0]); tree.nodes.Remove(taken[1]); tree.nodes.Add(parent); } tree.Root = tree.nodes.FirstOrDefault(); } return(tree); }