C#数据结构-赫夫曼树
什么是赫夫曼树?
赫夫曼树(Huffman Tree)是指给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小。哈夫曼树(也称为最优二叉树)是带权路径长度最短的树,权值较大的结点离根较近。
1 public class HNode<T>
2 {
3 public HNode()
4 {
5 data = default(T);
6 weight = 0;
7 leftNode = null;
8 rightNode = null;
9 }
10
11 public HNode(T val)
12 {
13 data = val;
14 weight = 0;
15 leftNode = null;
16 rightNode = null;
17 }
18
19 /// <summary>
20 /// 权重
21 /// </summary>
22 public int weight { get; set; }
23
24 /// <summary>
25 /// 内容
26 /// </summary>
27 public T data { get; set; }
28
29 /// <summary>
30 /// 左树
31 /// </summary>
32 public HNode<T> leftNode { get; set; }
33
34 /// <summary>
35 /// 右树
36 /// </summary>
37 public HNode<T> rightNode { get; set; }
38 }
1 /// <summary>
2 /// 赫夫曼树
3 /// </summary>
4 /// <typeparam name="T"></typeparam>
5 public class HTree<T>
6 {
7 /// <summary>
8 /// 树的头结点
9 /// </summary>
10 public HNode<T> head { get; set; }
11
12 /// <summary>
13 /// 构造函数
14 /// </summary>
15 /// <param name="val"></param>
16 public HTree(T val)
17 {
18 head = new HNode<T>(val);
19 }
20
21 public HTree()
22 {
23 head = new HNode<T>();
24 }
25 /// <summary>
26 /// 构建树结构
27 /// </summary>
28 /// <param name="list"></param>
29 public void build(List<T> list)
30 {
31 //判断是否能构建树结构
32 if (list == null || list.Count <2)
33 throw new ArgumentOutOfRangeException("params error");
34 //分组统计
35 List<HNode<T>> nodes = new List<HNode<T>>();
36 nodes.AddRange(from m in list group m by m into g
37 select new HNode<T> { data = g.Key,weight = g.Count()});
38 //排序
39 nodes = nodes.OrderBy(i => i.weight).ToList();
40
41 for (int i =1; i< nodes.Count; i++)
42 {
43 HNode<T> parentNode = new HNode<T>();
44 if (i == 1)
45 {
46 //先取最小的两个节点
47 parentNode.leftNode = nodes[0];
48 parentNode.rightNode = nodes[1];
49 parentNode.weight = nodes[0].weight + nodes[1].weight;
50 }
51 else
52 {
53 //依次取节点构建树
54 if (head.weight >= nodes[i].weight)
55 {
56 parentNode.leftNode = head;
57 parentNode.rightNode = nodes[i];
58 }
59 else
60 {
61 parentNode.rightNode = head;
62 parentNode.leftNode = nodes[i];
63 }
64 parentNode.weight = head.weight + nodes[i].weight;
65 }
66 head = parentNode;
67 }
68 }
69
70 /// <summary>
71 /// 先序遍历
72 /// </summary>
73 /// <param name="index"></param>
74 public void PreorderTraversal(HNode<T> node)
75 {
76 //递归的终止条件
77 if (head == null)
78 {
79 Console.WriteLine("当前树为空");
80 return;
81 }
82 if (node != null)
83 {
84 if(node.data != null)
85 Console.WriteLine($"{node.data} {node.weight}");
86 PreorderTraversal(node.leftNode);
87 PreorderTraversal(node.rightNode);
88 }
89 }
90 }
测试代码:
1 List<string> list = new List<string>() { "A","B", "B", "C", "C", "C", "D", "D", "D", "D", "E", "E", "E", "E", "E" };
2 HTree<string> tree = new HTree<string>();
3 tree.build(list);
4 tree.PreorderTraversal(tree.head);
打印结果:
A 1
B 2
C 3
D 4
E 5
用这个例子现在我们看下构建的二叉树结构:


C#数据结构-赫夫曼树的更多相关文章
- Java数据结构和算法(四)赫夫曼树
Java数据结构和算法(四)赫夫曼树 数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html) 赫夫曼树又称为最优二叉树,赫夫曼树的一个 ...
- 【数据结构】赫夫曼树的实现和模拟压缩(C++)
赫夫曼(Huffman)树,由发明它的人物命名,又称最优树,是一类带权路径最短的二叉树,主要用于数据压缩传输. 赫夫曼树的构造过程相对比较简单,要理解赫夫曼数,要先了解赫夫曼编码. 对一组出现频率不同 ...
- Android版数据结构与算法(七):赫夫曼树
版权声明:本文出自汪磊的博客,未经作者允许禁止转载. 近期忙着新版本的开发,此外正在回顾C语言,大部分时间没放在数据结构与算法的整理上,所以更新有点慢了,不过既然写了就肯定尽力将这部分完全整理好分享出 ...
- javascript实现数据结构: 树和二叉树的应用--最优二叉树(赫夫曼树),回溯法与树的遍历--求集合幂集及八皇后问题
赫夫曼树及其应用 赫夫曼(Huffman)树又称最优树,是一类带权路径长度最短的树,有着广泛的应用. 最优二叉树(Huffman树) 1 基本概念 ① 结点路径:从树中一个结点到另一个结点的之间的分支 ...
- 【算法】赫夫曼树(Huffman)的构建和应用(编码、译码)
参考资料 <算法(java)> — — Robert Sedgewick, Kevin Wayne <数据结构> ...
- 赫夫曼树JAVA实现及分析
一,介绍 1)构造赫夫曼树的算法是一个贪心算法,贪心的地方在于:总是选取当前频率(权值)最低的两个结点来进行合并,构造新结点. 2)使用最小堆来选取频率最小的节点,有助于提高算法效率,因为要选频率最低 ...
- puk1521 赫夫曼树编码
Description An entropy encoder is a data encoding method that achieves lossless data compression by ...
- 数据结构-哈夫曼树(python实现)
好,前面我们介绍了一般二叉树.完全二叉树.满二叉树,这篇文章呢,我们要介绍的是哈夫曼树. 哈夫曼树也叫最优二叉树,与哈夫曼树相关的概念还有哈夫曼编码,这两者其实是相同的.哈夫曼编码是哈夫曼在1952年 ...
- 高级数据结构---赫(哈)夫曼树及java代码实现
我们经常会用到文件压缩,压缩之后文件会变小,便于传输,使用的时候又将其解压出来.为什么压缩之后会变小,而且压缩和解压也不会出错.赫夫曼编码和赫夫曼树了解一下. 赫夫曼树: 它是一种的叶子结点带有权重的 ...
随机推荐
- java后端开发三年!你还不了解Spring 依赖注入,凭什么给你涨薪
前言 前两天和一个同学吃饭的时候同学跟我说了一件事,说他公司有个做了两年的人向他提出要涨薪资,他就顺口问了一个问题关于spring依赖注入的,那个要求涨薪的同学居然被问懵了...事后回家想了想这一块确 ...
- 回收站都找不到的文件,EasyRecovery帮你找
"有人相爱,有人看海,有人深夜两点还在找文件."没错,有人正是不才本人. 细数下来,这已经是本人第五六七八次丢文件了,每次丢的原因很奇怪:删错了.保存完找不到了.或者没有原因就那样 ...
- 吉他指弹入门——贝斯(walking bass)
在每一个乐队中都有一个神秘而低调的乐手,在现场演奏中你甚至感觉不到他的存在,但是他又异常重要.即是鼓手打拍的好伙伴,又是吉他手忘乎所以solo时的警报器.没错,这个人就是贝斯手.要是我们做了什么气跑了 ...
- 数学分析理论(rudin版)笔记:实数系和复数系.2:抄书版
有理数(rational number)记为 Q,实数记为 R 虽然任意两个不同的有理数间还有一个有理数,但是有理数集中还是会有 "间隙",而实数集填补了这些间隙. 集合(set) ...
- 【bzoj2588/P2633】count on a tree —— LCA + 主席树
(以下是luogu题面) 题目描述 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问 ...
- Java基础教程——结构化编程
结构化编程 各结构的图示请参见: https://www.cnblogs.com/tigerlion/p/10703926.html 选择结构 |-if:如果 |-else:其他:此外:否则. pub ...
- django搭建完毕运行显示hello django
1.使用pycharm打开工程,进入工程配置解释器路径 2.视图和url 视图:处理我们从业务的地方,可以理解为函数 url:进行路由匹配的地方,先在主工程bookpro中进行匹配,如果匹配ok,那么 ...
- dubbo源码调试
1.从github上clone下duboo的源码并checkout tag到2.6.5可以看到如下的结构: 其中all-dubbo的pom如下: 这里会将dubbo的其他项目在package的时候打到 ...
- 锐安信sslTrus与GeoTrust SSL证书的对比
当您想要为您的网站购买一款SSL证书时,是不是既想要价格便宜,又想要安全性能服务好的证书,最后又在品牌上犹豫不决?如何选择SSL证书?哪款SSL证书是最适合您的?本文将详细对比分析锐成信息平台上畅销品 ...
- C#中的WinForm问题——如何设置窗体的大小为超过屏幕显示的最大尺寸?
今天在学习C#时遇到了一个问题,在此记录下来,留作日后总结复习之用,也分享给有同样问题和困扰的园友. 我手上的电脑是笔记本电脑,屏幕的尺寸大小为1366*768,然而项目所使用的屏幕大小为1920*1 ...