Example #1
0
        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);
        }