public void Hafman() { /*Построение таблицы кодов*/ List<Node> tree = new List<Node>(); foreach (Symbol t in abc) { Node temp = new Node(); temp.element.Add(t); temp.comute(); tree.Add(temp); } List<Node> nodes = new List<Node>(); foreach (Node t in tree) { nodes.Add(t); } HafmanTree(ref tree); foreach (Node t in nodes) { Node temp = t; int index=Search(t.element[0].character + ""); int i = 0; while (temp.element.Count != abc.Count) { abc[index].code += temp.bit; temp = temp.parent; i++; //if (i==4) // MessageBox.Show(temp.sumChance+ ""); } char[] arr = abc[index].code.ToCharArray(); Array.Reverse(arr); abc[index].code=new string(arr); } }
public void HafmanTree(ref List<Node> tree) { bool flag = false; foreach (Node t in tree) { if (t.element.Count == abc.Count) flag = true; //MessageBox.Show(t.element.Count + ""); } if (flag) return; /*Выбор новой вершины дерева, формирование дерева*/ Node min1=null, min2=null; foreach (Node t in tree) { if (!t.flag) { min1 = t; break; } } foreach (Node t in tree) { if (!t.flag && t != min1) { min2 = t; break; } } foreach (Node t in tree) { if (t.sumChance < min1.sumChance && t != min2 && !t.flag) min1 = t; } foreach (Node t in tree) { if (t.sumChance < min2.sumChance && t != min1 && !t.flag) min2 = t; } Node z = new Node(); foreach (Symbol t in min1.element) { z.element.Add(t); } foreach (Symbol t in min2.element) { z.element.Add(t); } z.comute(); min1.parent = z; min2.parent = z; min1.bit = "0"; min2.bit = "1"; min1.flag = true; min2.flag = true; tree.Add(z); // HafmanTree(ref tree); }