`
CreazyApple
  • 浏览: 63785 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

构建哈夫曼树并打印哈夫曼编码

 
阅读更多

#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. 输出哈夫曼编码:将哈夫曼编码表按照字符...

    构造哈夫曼树,并生成编码

    ### 构造哈夫曼树并生成编码 #### 哈夫曼树简介 ...本篇代码详细展示了如何构建哈夫曼树并生成相应的哈夫曼编码。通过理解这些概念和技术细节,读者能够更好地掌握哈夫曼树的构建方法及其在实际应用中的价值。

    c语言哈夫曼树编码器,通过构建哈夫曼树来实现对数据的编码和解码

    哈夫曼树编码器(Huffman Tree Encoder)是一种常用的数据压缩算法,它通过构建哈夫曼树来实现对数据的编码和解码。以下是对哈夫曼树编码器的总结:哈夫曼树的构建: 哈夫曼树是一种特殊的二叉树,它的构建基于数据...

    c语言 哈夫曼树

    哈夫曼树,又称最优二叉树或最小带权路径长度树,是数据结构领域中一种特殊的二叉树。在C语言中实现哈夫曼树主要用于数据的...代码可能包括创建节点、维护优先队列、构建哈夫曼树以及生成和输出哈夫曼编码的具体步骤。

    数据结构 哈夫曼树

    在实际应用中,例如文本压缩,我们可以先统计文本中每个字符的出现频率,然后构建哈夫曼树,得到各字符的哈夫曼编码。之后,将原始文本转换为哈夫曼编码的“0”和“1”序列,这就是压缩后的报文。解压时,只需要按照...

    根据给定的n个权值构造哈夫曼树。通过遍历此二叉树完成哈夫曼编码。

    题目给出的部分代码展示了如何实现上述构建哈夫曼树的过程,并基于这棵树来生成哈夫曼编码。接下来,我们将深入分析这部分代码: 1. **类型定义:** - 定义了`HTNode`结构体,用于存储节点的权值、父节点索引、...

    实验报告 哈夫曼树及哈夫曼编码

    在构建哈夫曼树时,可以使用“优先队列”或“最小堆”的方法,不断选择两个权值最小的结点合并为一个新的结点,新结点的权值为两个子结点的权值之和,然后将新结点插入到队列或堆中,重复此过程直到只剩下一个结点,...

    C语言实现哈夫曼树的构建

    3. 实现createHuTree函数,构建哈夫曼树 四、哈夫曼树的优点 哈夫曼树的优点包括: 1. 压缩率高 2. 编码效率高 3. 构建速度快 五、哈夫曼树的应用 哈夫曼树的应用包括: 1. 数据压缩 2. 图像压缩 3. 文本...

    哈夫曼树及其编码

    构建哈夫曼树和编码的过程可以通过编程实现,如C++语言可以利用STL中的优先队列容器来辅助构建哈夫曼树,同时利用数组或字典结构来存储字符和对应的哈夫曼编码。 在进行课设时,学生需要理解哈夫曼树的基本概念,...

    构建哈夫曼树和编码

    自己写的哈夫曼树还行 各位看官来下载吧 测试无错误

    Python完成哈夫曼树编码过程及原理详解

    在给定的内容中,提供了构建哈夫曼树的Python代码示例,包括定义节点类TreeNode,创建节点队列类nodeQeuen,字符频率统计函数freChar,创建哈夫曼树函数creatHuffmanTree,由哈夫曼树得到哈夫曼编码表函数...

    哈夫曼树和哈夫曼编码的Java实现

    3. **哈夫曼树的构建**:使用优先队列逐步合并节点,构建哈夫曼树。 4. **编码生成**:遍历哈夫曼树,为每个字符生成哈夫曼编码,通常使用递归或栈来辅助实现。 5. **编码与解码**:构建哈夫曼编码表,用于编码和...

    哈夫曼树和哈夫曼编码的实现

    然后,使用哈夫曼算法构建哈夫曼树,并生成哈夫曼编码。 哈夫曼树的应用非常广泛,如文本压缩、图像压缩、数据压缩等。哈夫曼编码也广泛应用于数据压缩、编码等领域。 在实际应用中,哈夫曼树和哈夫曼编码可以用于...

    哈夫曼树编码及解码技术

    - `HuffmanCoding` 函数负责构建哈夫曼树并生成哈夫曼编码。 - `CheckCoding` 函数用于验证编码的正确性。 - `HuffmanTranslateCoding` 函数实现了哈夫曼编码的解码过程。 #### 五、总结 通过对哈夫曼树的构建、...

Global site tag (gtag.js) - Google Analytics