【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

固定长度编码

 

 


可变长度编码

 

 用于数据压缩

 

 

posted @ 2022-05-23 14:42  小林野夫  阅读(255)  评论(0编辑  收藏  举报
原文链接:https://www.cnblogs.com/cdaniu/