【C# 数据结构】哈夫曼树
哈夫曼树
定义
在含有n个带权叶结点的二叉树中,其中带权路径长度(WPL)最小的二叉树称为哈夫曼树,也称最优二叉树
构造哈夫曼树
给定n个权值分别为w1, w2..., wn的结点,构造哈夫曼树的算法描述如下:
1)将这n个结点分别作为n棵仅含一个结点的二叉树,构成森林F。
2)构造一个新结点,从F中选取两棵根结点权值最小的树作为新结点的左,右(顺序任意)子树,并且将新结点的权值 置为左、右子树上根结点的权值之和。
3)从F中删除刚才选出的两棵树,同时将新得到的树加入F中。
4) 重复步骤2)和3),直至F中只剩下一棵树为止。
第一种方式
1)在森林中选择权值最小的两个子树组成新的子树:选a(权值为1) 和c(权值为2) 组成一个二叉树 (权值 1+2);
2)新组成的子树(权值为3),将新的子树放入森林中。
3)重复(1)和(2)步骤。
第二种方式
特点
1)每个初始结点最终都成为叶结点,且权值越小的结点到根结点的路径长度越大
2)哈夫曼树的结点总数为2n -1
3)哈夫曼树中不存在度为1的结点。
4)哈夫曼树并不唯一,但WPL必然相同且为最优
应用
用于编码
有哈夫曼树得到哈夫曼编码――字符集中的每个字符作为一个叶子结点,各个字符出现的频度作为结点的权值,根据之前介绍的方法构造哈夫曼树。路径左边为1,右边为0(顺序随便)
1)固定长度编码――每个字符用相等长度的二进制位表示
2)可变长度编码――允许对不同字符用不等长的二进制位表示,此时的权值表示概率。概率高的离根节点越近。
假设,100题中有80题选c,10题选A,8题选B,2题选D
固定长度编码
可变长度编码
用于数据压缩
编程是个人爱好