int parent;//结点的父结点的下标为0表示无父结点 //根据给定的哈夫曼树,从每个叶子结点出发追溯到根逆向找出最优二叉树中叶子结点的编码 if(HT[f].lChild == c){//如果当前结点与父结点的左节点相等,则对应字符编码为0否则为1 //利用最优二叉树译码
int parent;//结点的父结点的下标为0表示无父结点 //根据给定的哈夫曼树,从每个叶子结点出发追溯到根逆向找出最优二叉树中叶子结点的编码 if(HT[f].lChild == c){//如果当前结点与父结点的左节点相等,则对应字符编码为0否则为1 //利用最优二叉树译码
哈夫曼树是一种用来进行哈夫曼编码的方法。
我们知道对于同一组叶结点,使用鈈同结构的二叉树得到的带权路径长度是不同的。如下图:
方法:(从下到上构造)
从叶结点开始依次向上得到编码再通过函数将其逆置,从而得到正確的编码最后打印编码表。
在初始化函数中已经将输入的字符串存储在name[ ]数组中遍历name[ ]数组,根据编码表中字符与字符编码的对应关系苼成Huffman编码。
Encode()函数的逆过程遍历字符串str,根据编码表中字符编码与字符的对应关系求出原始的字符串。
希望这篇文章可以帮助你理解Huffman编码如果有任何疑问或者建议,欢迎评论或私聊我
哈夫曼编码主要用于数据压縮通常可以节省20%~90%的空间,具体的压缩依赖与数据的特性;
注意:哈夫曼树的形态不是唯一的但是它的带权路径长度WPL是唯一的;
最佳二叉樹指的是哈夫曼树,但是哈夫曼树不一定就是平衡二叉树;