Huffman树

结点定义:

1 /*
2  * Huffman树结点定义
3  */
4 struct Node
5 {
6     ElementType weight;         // 结点的权值
7     struct Node *leftChild;     // 结点的左指针
8     struct Node *rightChild;    // 结点的右指针
9 };

根据给定权值数组,构建一个Huffman树:

 1 /*
 2  * 输出内存申请失败的消息
 3  */
 4 void showFailureMessage()
 5 {
 6     printf("Memory allocate failure!\n");
 7     exit(-1);
 8 }
 9
10 /*
11  * 根据数组获取数组的长度
12  */
13 int getArrayLength(ElementType weights[])
14 {
15 }
16
17 /*
18  * 对程序运行中申请的内存空间做事后处理
19  */
20 void destroy(struct Node **)
21 {
22 }
23
24 /*
25  * 为给定权值数组创建一个Huffman树,返回根结点指针
26  */
27 Node * createHuffmanTree(ElementType weights[])
28 {
29     /* 根据传入的数组初始化 */
30     int arrayLength = getArrayLength(weights);
31     struct Node **nodePointerArray = (struct Node **)malloc(sizeof(struct Node *) * arrayLength);
32     if(nodePointerArray == NULL)
33         showFailureMessage();
34     for(int index = 0; index < arrayLength; ++index) {    // 初始化指针数组nodePointerArray,每个指针指向一个二叉树结点
35         nodePointerArray[index] = (struct Node *)malloc(sizeof(struct Node));
36         if(nodePointerArray[index] == NULL)
37             showFailureMessage();
38         nodePointerArray[index]->weight = weights[index]; // 是树中各结点权值与传入的数组weights中元素一一对应
39         nodePointerArray[index]->leftChild = nodePointerArray[index]->rightChild = NULL;
40     }
41
42     /* 在初始化基础上进行(数组长度-1)次操作构造Huffman树 */
43     struct Node * rootNode = NULL;
44     for(int index = 0; index < arrayLength; ++index) {
45         /* 找到自index后的最小值和次小值索引 */
46         int lowestIndex = index;
47         int lowSecondIndex = index + 1;
48         for(int innerIndex = lowSecondIndex; innerIndex < arrayLength; ++innerIndex) {
49             if(nodePointerArray[innerIndex]->weight < nodePointerArray[lowestIndex]->weight) {
50                 lowSecondIndex = lowestIndex;
51                 lowestIndex = innerIndex;
52             } else if(nodePointerArray[innerIndex]->weight < nodePointerArray[lowSecondIndex]->weight) {
53                 lowSecondIndex = innerIndex;
54             }
55         }
56
57         /* 将最小值和次小值所对应的结点(或子树的根结点)生成一颗二叉树 */
58         rootNode = (struct Node *)malloc(sizeof(struct Node));
59         if(rootNode == NULL)
60             showFailureMessage();
61         rootNode->weight = nodePointerArray[lowestIndex]->weight + nodePointerArray[lowSecondIndex]->weight;
62         rootNode->leftChild = nodePointerArray[lowestIndex];
63         rootNode->rightChild = nodePointerArray[lowSecondIndex];
64
65         /* 此次生成二叉树后,对本次循环的索引值、最小值的索引值、次小值的索引值
66          * 所对应的结点做事后处理(此处巧用最小值和次小值所在结点需要移除) */
67         nodePointerArray[lowestIndex] = rootNode;
68         nodePointerArray[lowSecondIndex] = nodePointerArray[index];
69         nodePointerArray[index] = NULL;
70     }
71     destroy(nodePointerArray);
72
73     return rootNode;
74 }

Huffman树求得树中各字符编码:

 1 /**
 2  * 由给定的编码Huffman树求得树中各字符编码的算法,并分析器复杂度
 3  **/
 4  void HuffmanCode(Node *root, int index)
 5  {
 6     static int code[SIZE];                                          // code存放字符编码,其长度等于树的深度
 7     if(root != NULL) {
 8         if(root->leftChild == NULL && root->rightChild == NULL) {
 9             cout << "Weight:" << root->data << " coding:";
10             for(int in = 0; in < SIZE; ++in)                        // 输出叶子结点的编码
11                 cout << code[in];
12             count << endl;
13         } else {
14             code[index] = 0;
15             HuffmanCode(root->leftChild, (index + 1));              // 对左子树搜索
16             code[index] = 1;
17             HuffmanCode(root->rightChild, (index + 1));             // 对右子树搜索
18         }
19     }
20  }

OK哒!O(∩_∩)O哈!

Huffman树

时间: 2024-08-01 15:42:13

Huffman树的相关文章

Huffman树与编码

带权路径最小的二叉树称为最优二叉树或Huffman(哈夫曼树). Huffman树的构造 将节点的权值存入数组中,由数组开始构造Huffman树.初始化指针数组,指针指向含有权值的孤立节点. b = malloc(n*sizeof(BTreeNode)); for (i = 0; i < n; i++) { b[i] = malloc(sizeof(BTreeNode)); b[i]->data = a[i]; b[i]->left = NULL; b[i]->right = NU

数据结构之huffman树

#include <stdio.h> #include<stdlib.h> #define MAXBIT      99 #define MAXVALUE  9999 #define MAXLEAF     30 #define MAXNODE    MAXLEAF*2 -1 typedef struct  {     int bit[MAXBIT];     int start; } HCodeType;        /* 编码结构体 */ typedef struct {  

Huffman树的编码译码

上个学期做的课程设计,关于Huffman树的编码译码. 要求: 输入Huffman树各个叶结点的字符和权值,建立Huffman树并执行编码操作 输入一行仅由01组成的电文字符串,根据建立的Huffman树进行译码操作,程序最后输出译码后的结果 Huffman.h定义了树的结点信息,各种操作.GCC编译通过. 1 #ifndef HUFFMAN_H_INCLUDED 2 #define HUFFMAN_H_INCLUDED 3 #include <iostream> 4 #include <

poj 3253 Fence Repair(模拟huffman树 + 优先队列)

题意:如果要切断一个长度为a的木条需要花费代价a, 问要切出要求的n个木条所需的最小代价. 思路:模拟huffman树,每次选取最小的两个数加入结果,再将这两个数的和加入队列. 注意priority_queue的用法,原型: 1 priority_queue<Type> q; 2 priority_queue<Type,deque<Type>,Comp> q; 其中Type是类型,Comp是比较结构体,比较函数是它的括号重载,比如对int型从小到大排序的Comp结构体如

数据结构之Huffman树与最优二叉树

最近在翻炒一些关于树的知识,发现一个比较有意思的二叉树,huffman树,对应到离散数学中的一种名为最优二叉树的路径结构,而Huffman的主要作用,最终可以归结到一种名为huffman编码的编码方式,使用huffman编码方式,我们可以以平均长度最短的码字来记录一串信息,且每个信息分子的编码唯一,独立.从而最终合成编码所对应的信息唯一,无歧义. huffman树的创建时基于每个信息分子都拥有其权重,权重越大,越靠近树根,即路径越短, 下面我们我们来以一个huffman树的例子为例:简单引入一下

NOI 2015 荷马史诗【BZOJ 4198】k叉Huffman树

抱歉因为NOIP集训,好长时间没再写题解了. NOI 2015也就只有这道题一看就能懂了…… 4198: [Noi2015]荷马史诗 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 922  Solved: 473[Submit][Status][Discuss] Description 追逐影子的人,自己就是影子. ——荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷马史诗>.但是

【NOI2015】荷马史诗[Huffman树+贪心]

#130. [NOI2015]荷马史诗 统计 描述 提交 自定义测试 追逐影子的人,自己就是影子. ——荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷马史诗>.但是由<奥德赛>和<伊利亚特>组成的鸿篇巨制<荷马史诗>实在是太长了,Allison 想通过一种编码方式使得它变得短一些. 一部<荷马史诗>中有 nn 种不同的单词,从 11 到 nn 进行编号.其中第 ii 种单词出现的总

Huffman树的应用 (数据结构)

Huffman树的应用: 1.先选择一篇文章 2.然后统计字符个数 3.对个数不为0字符的进行编码 4.输出码文 5.进行译码 上机代码: /************************************************************************* > File Name: Huffman树的应用.cpp > Author: zzuspy > Mail: [email protected] > Created Time: 2014年12月3日

哈夫曼(Huffman)树与哈夫曼编码

声明:原创作品,转载时请注明文章来自SAP师太技术博客:www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将追究法律责任!原文链接:http://www.cnblogs.com/jiangzhengjun/p/4289610.html 哈夫曼树又称最优二叉树,是一种带权路径长最短的树.树的路径长度是从树根到每一个叶子之间的路径长度之和.节点的带树路径长度为从该节点到树根之间的路径长度与该节点权(比如字符在某串中的使用频率)的乘积. 比如有一串字符串如

Huffman树与最优二叉树续

OK,昨天我们对huffman数的基本知识,以及huffman树的创建做了一些简介,http://www.cnblogs.com/Frank-C/p/5017430.html 今天接着聊: huffman树创建完成之后,我们如何去得到huffman编码呢? 图12.4_1 huffman树形结构 图12.4_2  huffman存储结构(数组) 首先,以上面的树为例,我们必须明白几个要点: 1:从什么地方开始访问这颗树:根节点 , index 2n-1 = 15 2:访问的规则:向左为0  向右