构建abbcccdddd的哈夫曼树,并写出最后编码的二进制串。web
1.统计字符的频次svg
a:1 b:2 c :3 d:4
2.根据权重实现报文以下转换编码
a 100 b 101 c 11 d 0
3.构建字典spa
字符 a b c d 编码 100 101 11 0
4.C#代码
结果为 1101111111010100000code
using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApp3 { public class tree { public int value; public string name; public tree left; public tree right; } class Program { static void Main(string[] args) { string lie = "abbcccdddd"; Hashtable hs = new Hashtable(); hs.Add("*", ""); char[] names = lie.ToCharArray(); Dictionary<string, int> hs_names = new Dictionary<string, int>(); foreach (char name in names) { if (!hs_names.ContainsKey(name.ToString())) { hs_names.Add(name.ToString(), 1); } else { hs_names[name.ToString()]++; } } hs_names.OrderByDescending(v => v.Value).OrderByDescending(t => t.Key).ToDictionary(t => t.Key, v => v.Value); string streat = "left"; tree tree = new tree(); int i = 0; foreach (KeyValuePair<string, int> hs_name in hs_names) { AddTree(ref tree, hs_name.Key, hs_name.Value, ref streat,i); i++; } TraaAll(tree, ref hs); string write = ""; foreach (char name in names) { write = write + hs[name.ToString()].ToString(); } Console.WriteLine(write); Console.ReadLine(); } public static void AddTree(ref tree tree, string name, int nub, ref string streat,int i) { if (tree.name == null) { if (streat == "left") { tree _tree = new tree(); _tree.name = name; _tree.value = nub; tree.left = _tree; streat = "right"; } else { tree _tree = new tree(); _tree.name = name; _tree.value = nub; tree.right = _tree; tree.value = tree.left.value + tree.right.value; tree.name = "*"+ i; streat = "left"; } } else { tree _tree = new tree(); if (tree.value >= nub) { _tree.left = new tree(); _tree.left.name = name; _tree.left.value = nub; _tree.right = tree; _tree.name = "*"+ i; _tree.value = _tree.left.value + _tree.right.value; tree = _tree; } else { _tree.right = new tree(); _tree.right.name = name; _tree.right.value = nub; _tree.left = tree; _tree.name = "*"+ i; _tree.value = _tree.left.value + _tree.right.value; tree = _tree; } } } public static void TraaAll(tree tree, ref Hashtable hs) { if (tree.left != null) { if (hs.ContainsKey(tree.left.name)) { hs[tree.left.name] = hs[tree.name] + "0"; } else { hs.Add(tree.left.name, hs[tree.name] + "0"); } TraaAll(tree.left, ref hs); } if (tree.right != null) { if (hs.ContainsKey(tree.right.name)) { hs[tree.left.name] = hs[tree.name] + "1"; } else { hs.Add(tree.right.name, hs[tree.name] + "1"); } TraaAll(tree.right, ref hs); } } } }