哈夫曼又称最优二叉树, 是一种带权路径长度最短的二叉树。(注意带权路径WPL是指叶子节点,很多网上的文章有误导)
哈夫曼树相关名词
先看一棵哈夫曼树: (哈夫曼树推理是通过叶子节点,所以理解的时候需要忽略非叶子节点,很多文章在这点上有误导)
路径与路径长度: 从树中一个节点到另一个节点之间的分支构成了两个节点之间的路径,路径上的分支数目称作路径长度。若规定根节点位于第一层,则根节点到第H层的节点的路径长度为H-1。如到40 的路径长度为1;30的路径长度为2;20的路径长度为3。
节点的权: 将树中的节点赋予一个某种含义的数值作为该节点的权值,该值称为节点的权;
带权路径长度: 从根节点到某个节点之间的路径长度与该节点的权的乘积。例如上图节点10的路径长度为3,它的带权路径长度为10 * 3 = 30;
树的带权路径长度: 树的带权路径长度为所有叶子节点的带权路径长度之和,称为WPL。上图的WPL = 1x40+2x30+3x10+3x20 = 190,而哈夫曼树就是树的带权路径最小的二叉树。
哈夫曼树的构建
假设有n个权值,则构造出的哈夫曼树有n个叶子结点。 n个权值分别设为 w1、w2、…、wn,哈夫曼树的构造规则为:
将w1、w2、…,wn看成是有n 棵树的森林(每棵树仅有一个结点);
在森林中选出根结点的权值最小的两棵树进行合并,作为一棵新树的左、右子树,且新树的根结点权值为其左、右子树根结点权值之和;
从森林中删除选取的两棵树,并将新树加入森林;
重复上面两步,直到森林中只剩一棵树为止,该树即为所求得的哈夫曼树。
上图中,它的叶子节点为{10,20,30,40},以这4个权值构建哈夫曼树的过程为:
哈夫曼编码
为{10,20,30,40}这四个权值构建了哈夫曼编码后,我们可以由如下规则获得它们的哈夫曼编码:
从根节点到每一个叶子节点的路径上,左分支记为0,右分支记为1,将这些0与1连起来即为叶子节点的哈夫曼编码。如下图:
哈夫曼树详解及Java实现

哈夫曼树是一种带权路径长度最短的二叉树,常用于数据压缩。文章介绍了哈夫曼树的概念,包括路径长度、节点权值、带权路径长度和树的带权路径长度。构建哈夫曼树的过程涉及将权值最小的节点合并,并利用最小堆来优化这一过程。此外,文章还讲解了哈夫曼编码的生成规则和其在数据编码压缩中的作用。最后,给出了哈夫曼树的Java实现,包括节点类、哈夫曼树类和最小堆类的代码示例。
最低0.47元/天 解锁文章
4101

被折叠的 条评论
为什么被折叠?



