/// <summary> /// Сортировка узлов дерева по убыванию /// </summary> static void sortTree() { for (int index = 0; index < tree.Count - 1; index++) { for (int index2 = index; index2 < tree.Count; index2++) { if (tree[index].frequency < tree[index2].frequency) { huffmannTreeNode buf = tree[index]; tree[index] = tree[index2]; tree[index2] = buf; } } } }
static void sortTree (List<huffmannTreeNode> tree)//сортировка по возрастанию { for (int index = 0; index < tree.Count - 1; index++) { for (int index2 = index; index2 < tree.Count; index2++) { if (tree[index].frequency < tree[index2].frequency) { huffmannTreeNode buf = tree[index]; tree[index] = tree[index2]; tree[index2] = buf; } } } }
static void FillTree(List<huffmannTreeNode> tree, List<huffmannTreeNode> source, List<huffmannTreeNode> newRes)//реализация кода Хаффмана { while (tree.Count > 1)//заполнение итогового дерева { sortTree(tree);//сортируем for (int index = 0; index < source.Count; index++)//идем по длине изначального дерева { if (tree[tree.Count - 2].text.Contains(source[index].text))//сравниваем предпоследний элемент в отсортированном дереве с изначальным(вспомогательным) { newRes[index] = new huffmannTreeNode(newRes[index].text, "0" + newRes[index].code, newRes[index].frequency);//если они сходятся по номеру частоты, то ставим ветку 0 } else if (tree[tree.Count - 1].text.Contains(source[index].text))//иначе если последний элемент отсортир дерева = изначальному по номеру частоты, то ставим 1 { newRes[index] = new huffmannTreeNode(newRes[index].text, "1" + newRes[index].code, newRes[index].frequency);//записываем в итоговое дерево результаты } } tree[tree.Count - 2] = new huffmannTreeNode(tree[tree.Count - 2].text + tree[tree.Count - 1].text, "", tree[tree.Count - 2].frequency + tree[tree.Count - 1].frequency);//в отсортированное дерево записываем сумму последнего и предпоседнего элементов по частотам на пред последнее место tree.RemoveAt(tree.Count - 1);//удаляем последний эл-т } }
static void Main(string[] args) { try { Console.WriteLine("Введите количество символов во входном алфавите"); int kolSymbol = int.Parse(Console.ReadLine()); for (int i = 0; i < kolSymbol; i++) { Console.WriteLine("Введите символ"); char symbol = char.Parse(Console.ReadLine()); Console.WriteLine("Введите частоту"); int frequency = int.Parse(Console.ReadLine()); freqs.Add(symbol, frequency); } foreach (KeyValuePair <char, int> Pair in freqs) { source.Add(new huffmannTreeNode(Pair.Key.ToString(), "", Pair.Value)); tree.Add(new huffmannTreeNode(Pair.Key.ToString(), "", Pair.Value)); newRes.Add(new huffmannTreeNode(Pair.Key.ToString(), "", Pair.Value)); } while (tree.Count > 1) { sortTree(); for (int index = 0; index < source.Count; index++) { if (tree[tree.Count - 2].text.Contains(source[index].text)) { newRes[index] = new huffmannTreeNode(newRes[index].text, "0" + newRes[index].code, newRes[index].frequency); } else if (tree[tree.Count - 1].text.Contains(source[index].text)) { newRes[index] = new huffmannTreeNode(newRes[index].text, "1" + newRes[index].code, newRes[index].frequency); } } tree[tree.Count - 2] = new huffmannTreeNode(tree[tree.Count - 2].text + tree[tree.Count - 1].text, "", tree[tree.Count - 2].frequency + tree[tree.Count - 1].frequency); tree.RemoveAt(tree.Count - 1); } SortedDictionary <string, string> codes = new SortedDictionary <string, string>(); for (int index = 0; index < source.Count; index++) { codes.Add(newRes[index].code, newRes[index].text); } Console.WriteLine("Список кодовых слов:"); if (codes.Count > 1) { foreach (KeyValuePair <string, string> keyValue in codes) { Console.WriteLine(keyValue.Value + " (" + keyValue.Key + ")"); } } else { foreach (KeyValuePair <string, string> keyValue in codes) { Console.WriteLine(keyValue.Value + " ( 0 )"); } } } catch (System.ArgumentException) { Console.WriteLine("Вы уже добавили этот символ. Завершение работы программы"); } catch (System.FormatException) { Console.WriteLine("Вы ввели не символ. Завершение работы программы"); } Console.ReadKey(); }