public void GenerateHuffmanTreev2(WordFreqGenerator wordFreq) { /*Huffman (c) n = |c| Q = c for i =1 to n-1 do z = Allocate-Node () x = left[z] = EXTRACT_MIN(Q) y = right[z] = EXTRACT_MIN(Q) f[z] = f[x] + f[y] INSERT (Q, z) return EXTRACT_MIN(Q) */ int n = wordFreq.WordStatsDict.Count(); PQueue Q = new PQueue(); BinTreeNode node1; BinTreeNode node2; BinTreeNode node3; //Add each leaf to priority Q foreach(KeyValuePair<char, int> kvp in wordFreq.WordStatsDict) { node1 = new BinTreeNode(kvp); Q.Enqueue(node1); } for (int i = 1; i < n; i++) { node1 = Q.Dequeue(); node2 = Q.Dequeue(); node3 = MergeNodes(node1, node2); Q.Enqueue(node3); } root = Q.Dequeue(); }
static void Main(string[] args) { WordFreqGenerator freqgen = new WordFreqGenerator(); //freqgen.PopulateDictionary("aabbccaabacdefabce"); //freqgen.PrintDictionary(); freqgen.WordStatsDict.Add('a', 45000); freqgen.WordStatsDict.Add('b', 13000); freqgen.WordStatsDict.Add('c', 12000); freqgen.WordStatsDict.Add('d', 16000); freqgen.WordStatsDict.Add('e', 9000); freqgen.WordStatsDict.Add('f', 5000); HuffmanTree tree = new HuffmanTree(); tree.GenerateHuffmanTreev2(freqgen); tree.TraverseTreeBFSAndGenCode(tree.root); // Console.WriteLine("Encoded string for {0} is {1}", "123456", tree.EncodeString("123456")); // Console.WriteLine("Decoded string for {0} is {1}", "011101100010100001", tree.DecodeString("011101100010100001")); Console.ReadLine(); }