#include <stdio.h>
#include <stdlib.h>
typedef struct _Node{
float data;
struct _Node *lchild;
struct _Node *rchild;
int huffmanCode[10],pos;//保存编码,在数组中从后往前存储,最多10位
} Node,*Tree;
/* 排序算法,从大到小 */
void Sort(float a[],int low,int high)
{
int i;
float temp;
if(low == high)return;
for(i=low; i<=high; i++){
if(a[i] > a[low]){
temp = a[low];
a[low] = a[i];
a[i] = temp;
}
}
Sort(a,low+1,high);
}
/* 将一个字符型数组 char a[]转化为 Tree型数组,而且已经从大到小排序
* 为构建哈夫曼树做准备*/
Tree* InitHuffmanTree(float a[],int count)
{
int i,j;
Tree T ;
Sort(a,0,count-1);//先排序
Tree *HuffmanTrees = (Tree *)malloc(sizeof(Tree));
for(i=0; i<count; i++){
T = (Node *)malloc(sizeof(Node));
T->data = a[i];
T->lchild = T->rchild = NULL;
T->pos = 10;
HuffmanTrees[i] = T;
}
return HuffmanTrees;
}
/* 给一棵子树的节点赋哈夫曼编码 */
void Encoding(Tree head,int code)
{
if(!head)return;
head->huffmanCode[--(head->pos)] = code;
Encoding(head->lchild,code);
Encoding(head->rchild,code);
}
/* 构建哈夫曼树,打印哈夫曼编码
* huffmanTrees[]中存储的是所有huffman树的根,
* 而且已经从大到小排序*/
Tree CreateHuffmanTree(Tree *huffmanTrees,int count)
{
int i;
if(count <= 1)return huffmanTrees[0];
Node *newTree = NULL;
if(!(newTree=(Node *)malloc(sizeof(Node))))printf("overflow!\n");
newTree->data = huffmanTrees[count-1]->data + huffmanTrees[count-2]->data;
newTree->lchild = huffmanTrees[count-1];
Encoding(huffmanTrees[count-1],0);//修改子树的哈夫曼编码
newTree->rchild = huffmanTrees[count-2];
Encoding(huffmanTrees[count-2],1);
newTree->pos = 10;
count -= 2;
/*插入合适位置(从大到小顺序)*/
for(i=count; i>0 && newTree->data > huffmanTrees[i-1]->data; i--)
{
huffmanTrees[i] = huffmanTrees[i-1];
}
huffmanTrees[i] = newTree;
count++;
return CreateHuffmanTree(huffmanTrees,count);
}
/* 输出哈夫曼编码 : 左0右1*/
float printHuffmanCode(Tree head)
{
int i;
static float length = 0,TotLen=0,num=0;
if(!head)return length;
if (!head->lchild && !head->rchild)
{
for(i=head->pos; i<10; i++)printf("%d",head->huffmanCode[i]);
printf("\t%.2f\n",head->data);
TotLen += head->data * (10-head->pos);
num += head->data;
}
printHuffmanCode(head->lchild);
printHuffmanCode(head->rchild);
length = TotLen/num;
return length;
}
int main(int argc, char *argv[])
{
float a[] = {.23,.11,.05,.03,.29,.14,.07,.08},length;
int count = 8;
Tree *huffmanTrees = InitHuffmanTree(a,count);
Tree huffmanTree = CreateHuffmanTree(huffmanTrees,count);
printf("Here is the HuffmanCode :\n\n");
length = printHuffmanCode(huffmanTree);
printf("\nAverage length of the code : %.2f\n",length);
getchar();
}
分享到:
相关推荐
在实际应用中,我们通常需要编写程序来实现哈夫曼树的构建和哈夫曼编码的生成。这涉及到数据结构的设计,如使用数组、链表或者平衡二叉树来存储节点,以及算法的设计,如如何高效地合并节点和构建编码表。"哈夫曼...
1. 构建哈夫曼树:从输入的n个字符及其出现频率构建哈夫曼树。哈夫曼树的构建过程通常通过合并频率最低的两个节点(称为“贪心”策略)不断进行,直到所有字符形成一棵树,每个字符最终成为一个叶子节点。 2. 编码...
给定n个权值作为n的叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短...使用数组构建哈夫曼树,并可用该树构造哈夫曼编码。
1. 构建哈夫曼树:创建节点类,实现优先队列(或堆),并编写构建哈夫曼树的函数。 2. 生成哈夫曼编码:遍历哈夫曼树,记录每个字符的编码,并存储在哈夫曼编码表中。 3. 输出哈夫曼编码:将哈夫曼编码表按照字符...
### 构造哈夫曼树并生成编码 #### 哈夫曼树简介 ...本篇代码详细展示了如何构建哈夫曼树并生成相应的哈夫曼编码。通过理解这些概念和技术细节,读者能够更好地掌握哈夫曼树的构建方法及其在实际应用中的价值。
哈夫曼树编码器(Huffman Tree Encoder)是一种常用的数据压缩算法,它通过构建哈夫曼树来实现对数据的编码和解码。以下是对哈夫曼树编码器的总结:哈夫曼树的构建: 哈夫曼树是一种特殊的二叉树,它的构建基于数据...
哈夫曼树,又称最优二叉树或最小带权路径长度树,是数据结构领域中一种特殊的二叉树。在C语言中实现哈夫曼树主要用于数据的...代码可能包括创建节点、维护优先队列、构建哈夫曼树以及生成和输出哈夫曼编码的具体步骤。
在实际应用中,例如文本压缩,我们可以先统计文本中每个字符的出现频率,然后构建哈夫曼树,得到各字符的哈夫曼编码。之后,将原始文本转换为哈夫曼编码的“0”和“1”序列,这就是压缩后的报文。解压时,只需要按照...
题目给出的部分代码展示了如何实现上述构建哈夫曼树的过程,并基于这棵树来生成哈夫曼编码。接下来,我们将深入分析这部分代码: 1. **类型定义:** - 定义了`HTNode`结构体,用于存储节点的权值、父节点索引、...
在构建哈夫曼树时,可以使用“优先队列”或“最小堆”的方法,不断选择两个权值最小的结点合并为一个新的结点,新结点的权值为两个子结点的权值之和,然后将新结点插入到队列或堆中,重复此过程直到只剩下一个结点,...
3. 实现createHuTree函数,构建哈夫曼树 四、哈夫曼树的优点 哈夫曼树的优点包括: 1. 压缩率高 2. 编码效率高 3. 构建速度快 五、哈夫曼树的应用 哈夫曼树的应用包括: 1. 数据压缩 2. 图像压缩 3. 文本...
构建哈夫曼树和编码的过程可以通过编程实现,如C++语言可以利用STL中的优先队列容器来辅助构建哈夫曼树,同时利用数组或字典结构来存储字符和对应的哈夫曼编码。 在进行课设时,学生需要理解哈夫曼树的基本概念,...
自己写的哈夫曼树还行 各位看官来下载吧 测试无错误
在给定的内容中,提供了构建哈夫曼树的Python代码示例,包括定义节点类TreeNode,创建节点队列类nodeQeuen,字符频率统计函数freChar,创建哈夫曼树函数creatHuffmanTree,由哈夫曼树得到哈夫曼编码表函数...
3. **哈夫曼树的构建**:使用优先队列逐步合并节点,构建哈夫曼树。 4. **编码生成**:遍历哈夫曼树,为每个字符生成哈夫曼编码,通常使用递归或栈来辅助实现。 5. **编码与解码**:构建哈夫曼编码表,用于编码和...
然后,使用哈夫曼算法构建哈夫曼树,并生成哈夫曼编码。 哈夫曼树的应用非常广泛,如文本压缩、图像压缩、数据压缩等。哈夫曼编码也广泛应用于数据压缩、编码等领域。 在实际应用中,哈夫曼树和哈夫曼编码可以用于...
- `HuffmanCoding` 函数负责构建哈夫曼树并生成哈夫曼编码。 - `CheckCoding` 函数用于验证编码的正确性。 - `HuffmanTranslateCoding` 函数实现了哈夫曼编码的解码过程。 #### 五、总结 通过对哈夫曼树的构建、...