哈夫曼树学习笔记-构建哈夫曼树
什么是哈夫曼树?
哈夫曼树(Huffman Tree)是一种用于数据压缩的树形数据结构,由David A. Huffman在1952年发明。哈夫曼树通常用于无损数据压缩中,将出现频率高的字符编码成较短的二进制序列,从而减少数据的存储空间。
哈夫曼树的构建过程是基于贪心算法,即每次选择出现频率最低的两个节点合并为一个新的节点,并将它们的权值相加作为新节点的权值,直到最终只剩下一个节点为止。在构建过程中,需要保证所有节点的左子树的权值总和小于右子树的权值总和。
最终生成的哈夫曼树是一棵带权路径长度最小的二叉树,可以根据哈夫曼树来生成每个字符的编码,从而实现数据压缩。
哈夫曼树构建过程
从数组中选择权值最小的两个结点,作为子结点,生成一棵树。
他们父结点的权值是他们两结点的权值之和。
然后再以此类推,重复两步,当数组中只剩下一棵树的时候,就已经构建好哈夫曼树了。哈夫曼树
构建哈夫曼树代码(C++)
下面是使用c++实现的构建哈夫曼树的代码代码语言:javascript复制
哈夫曼前中后、层次遍历
这里和二叉树是一样的,就不过多赘述了。都是采用了递归的算法。
c++实现:代码语言:javascript复制
层次遍历:
需要使用队列,首先根节点入队列,只要队列不是空的时候,头结点出队,并且访问出队结点,然后出队结点的左右孩子结点入队列。
一直重复上述步骤,最终即可实现层次遍历。代码语言:javascript复制
哈夫曼树编码
很多时候,再通讯的时候会使用到,需要对信息进行编码,这个时候哈夫曼树就可以对这些通讯实现最优的编码。
下面是哈夫曼树编码的实现算法:
通过递归调用实现哈夫曼编码,函数首先判断当前结点是否由孩子结点,如果没有孩子结点,就直接遍历静态数组,输出,此时数组就是当前结点的哈夫曼编码。如果有孩子结点,就继续递归,左孩子结点就给数组赋值为0,右孩子结点就给结点赋值为1。
c++:代码语言:javascript复制
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/92139.html