哈夫曼树的课程设计报告

合集下载

哈夫曼树结点数和叶子结点数的关系

哈夫曼树结点数和叶子结点数的关系

哈夫曼树结点数和叶子结点数的关系哈夫曼树是一种用来压缩信息的数据结构,它的关键在于能够将出现频率高的字符用较短的编码表示,从而达到节省空间的目的。

在构造哈夫曼树时,我们需要知道它的结点数和叶子结点数之间的关系,这是本文将要探讨的问题。

一、哈夫曼树的定义哈夫曼树(Huffman Tree)又称最优二叉树,是一种带权路径长度最短的树。

它的构造基于贪心算法,通过不断合并权值最小的两个子树来构造出最终的哈夫曼树。

在哈夫曼树中,树的每一个叶子结点都对应着一个字符,并且权值越大的叶子结点距离根结点越近。

二、哈夫曼树的结点数对于给定的n个字符(字符的出现概率已知),构造哈夫曼树时所需要的结点数是2n-1个。

这个结论可以通过归纳法证明。

首先,当n=1时,哈夫曼树只有一个结点,结论成立。

其次,当n=2时,哈夫曼树有3个结点。

假设当n=k时结论成立,考虑当n=k+1时的情况。

我们先对n个字符进行排序,找出权值最小的两个字符,将它们的权值相加得到一个新的权值,并构造一棵新的子树。

这样就将原来的n 个字符缩减成了n-1个字符,并且引入了一个新的结点。

在接下来的n-2次合并中,每次都引入了一个新的结点,所以总共需要2n-3个结点来构造出这n个字符对应的哈夫曼树。

此时,还需要引入一个新的根结点,作为两个结点(n个字符对应的两个子树)的父结点,并将两个子树连接到这个新的根结点上。

因此,总结点数为2n-3+1=2n-2。

最后,将新的根结点变为虚拟结点,并将n个叶子结点作为其子结点,就得到了结点数为2n-1的哈夫曼树。

三、哈夫曼树的叶子结点数在哈夫曼树中,每个叶子结点都对应着一个字符,因此叶子结点数就等于字符的个数n。

这个结论显然成立。

综上所述,哈夫曼树的结点数和叶子结点数之间存在如下关系:- 结点数 = 2n-1- 叶子结点数 = n这个结论可以帮助我们更好地理解哈夫曼树的构造过程,并且可以在实际应用中帮助我们提前估算哈夫曼树的大小。

6-10+哈夫曼树

6-10+哈夫曼树

哈夫曼--编码
按A B C D E F G H 这八个字母出现的频率构造哈夫曼树。
A:0110,B:10,C:1110,D:1111, E:110,F:00,G:0111,H:010
树的带权路径长度的含义是各个字符的编码长与 其出现次数的乘积之和,也就是电文的代码总长, 所以采用哈夫曼树构造的编码是一种能使电文代码 总长最短的不等长编码。
对于同一组给定叶结点所构造的哈夫曼树,树的形状可 能不同,但带权路径长度值是相同的,一定是最小的
哈夫曼树—示例 叶结点权值集合为W = W = {7,5,3,1}构造哈夫曼树三种形态:
给定n个权值,需经过n-1次合并最终能得到一棵哈夫曼树。 经过n-1次合并得到n-1个新结点,这n-1个新结点都是具有两个孩子结点的分支 结点。也就是说哈夫曼树中没有度为1的结点。 构造的哈夫曼树共有2n-1个结点。
这样的编码不能保证译码的唯一性,我们称之为具有二义性的译码。
哈夫曼--编码
哈夫曼树可用于构造使电文的编码总长最短的编码方案,且不会产生二义性。
设需要编码的字符集合为{d1,d2,…,dn}, 它们在电文中出现的次数或频率集合为{w1,w2,…,wn}, 以d1,d2,…,dn作为叶结点,w1,w2,…,wn作为它们的权值, 构造一棵哈夫曼树,然后,规定哈夫曼树中的左分支代表0,右分支代表1, 则从根结点到每个叶结点所经过的路径分支组成的0和1的序列便为该结点对应 字符的编码,我们称之为哈夫曼编码。
哈夫曼树--基本概念
给定一组权值,用以作为叶结点可以构造出不同形状的二叉树。 例如,设有4个权值分别为1,3,5,7,作为4个叶结点,构造二叉树。
(a)
(b)
(c)
(d)
(e)

数据结构第六章 哈夫曼树

数据结构第六章 哈夫曼树

6.3哈夫曼树6.3.1基本术语1.路径和路径长度若在一棵中存在着一个结点序列k1 ,k2,…,kj,使得ki是k1+i 的双亲(1ji<≤),则称此结点序列是从k1~kj的路径,因树中每个结点只有一个双亲结点,所以它也是这两个结点之间k 1~kj所经过的分支数称为这两点之间的路径长度,它等于路径上的结点数减1(实际就是边数)。

如在图5-19(a)所示的二叉树中,从树根结点L到叶子结点P的路径为结点序列L、M、S、P,路径长度为3。

(a) (b)(c) (d)图5-19 二叉排序树的删除2.结点的权和带权路径长度在许多应用中,常常将树中的结点赋上一个有着某种意义的实数,我们称此实数为该结点的权。

结点的带权路径长度规定为从树根结点到该结点之间的路径长度与该结点上权的乘积3.树的带权路径长度树的带权路径长度定义为树中所有叶子结点的带权路径长度这和,通常记为:2 WPL = ∑=n i i i lw 1其中n 表示叶子结点的数目,i w 和i l 分别表示叶子结点i k 的权值和根到i k 之间的路径长度 。

4.哈夫曼树哈夫曼(Huffman)树又称最优二叉树。

它是n 个带权叶子结点构成的所有二叉树中,带权路径长度 WPL 最小的二叉树。

因为构造这种树的算法是最早由哈夫曼于1952年提出的,所以被称之为哈夫曼树。

例如,有四个叶子结点a 、b 、c 、d ,分别带权为9、4、5、2,由它们构成的三棵不同的二叉树(当然还有其它许多种)分别如图5-20(a)到图5-20(c)所示。

b ac a b cd d c a b d(a) (b) (c)图5-20 由四个叶子结点构成的三棵不同的带权二叉树 每一棵二叉树的带权路径长度WPL 分别为:(a) WPL = 9×2 + 4×2 + 5×2 + 2×2 = 40(b) WPL = 4×1 + 2×2 + 5×3 + 9×3 = 50(c) WPL = 9×1 + 5×2 + 4×3 + 2×3 = 37其中图5-20(c)树的WPL 最小,稍后便知,此树就是哈夫曼树。

哈夫曼树.ppt

哈夫曼树.ppt

n
w i pi
最小,其中
i 1
Wi是第i个字符的使用频度,而Pi是第i个字符的编码长度, 这正是度量报文的平均长度的式子。
2020/3/5
21
例2:要传输的电文是{CAS;CAT;SAT;AT}
要传输的字符集是 D={C,A,S,T, ;}
每个字符出现的频率是W={ 2,4, 2,3, 3 }
PL=0+1+1+2+2=6
2020/3/5
9
问题2:什么样的带权树路径长度最小?
例如:给定一个权值序列{2,3,4,7},可构造的多种 二叉树的形态。
2
3
4
7
2 34 7
(a) WPL=2×2+2×3+2×4+2×7=32 (b) WPL=1×2+2×3+3×4+3×7=41
2020/3/5
7
4
3
2
(c) WPL=1×7+2×4+3×3+3×2=30
10
哈夫曼树的构造
例:给定权值{7,5,2,4},构造哈夫曼树。
6
方法: 75 2 4
75
(1)a 初始b化:由c 原始d数据生成森林a ; b c
d
(次2小)的找二最叉小(树a树) 作:为在左森右林子中树选构取造两一棵棵根新结的点二权叉值树最(,小b)其的根和
A)先序遍历
B)中序遍历
C)后序遍历
D)从根开始进行层次遍历
2、某二叉树的先序序列和后序序列正好相反,则该二叉
树一定是( B )的二叉树。
A)空或只有一个结点
B)高度等于其结点数
C)任一结点无左孩子
D)任一结点无右孩子

c语言哈夫曼树的构造及编码

c语言哈夫曼树的构造及编码

c语言哈夫曼树的构造及编码一、哈夫曼树概述哈夫曼树是一种特殊的二叉树,它的构建基于贪心算法。

它的主要应用是在数据压缩和编码中,可以将频率高的字符用较短的编码表示,从而减小数据存储和传输时所需的空间和时间。

二、哈夫曼树的构造1. 哈夫曼树的定义哈夫曼树是一棵带权路径长度最短的二叉树。

带权路径长度是指所有叶子节点到根节点之间路径长度与其权值乘积之和。

2. 构造步骤(1) 将待编码字符按照出现频率从小到大排序。

(2) 取出两个权值最小的节点作为左右子节点,构建一棵新的二叉树。

(3) 将新构建的二叉树加入到原来排序后队列中。

(4) 重复上述步骤,直到队列只剩下一个节点,该节点即为哈夫曼树的根节点。

3. C语言代码实现以下代码实现了一个简单版哈夫曼树构造函数:```ctypedef struct TreeNode {int weight; // 权重值struct TreeNode *leftChild; // 左子节点指针struct TreeNode *rightChild; // 右子节点指针} TreeNode;// 构造哈夫曼树函数TreeNode* createHuffmanTree(int* weights, int n) {// 根据权值数组构建节点队列,每个节点都是一棵单独的二叉树TreeNode** nodes = (TreeNode**)malloc(sizeof(TreeNode*) * n);for (int i = 0; i < n; i++) {nodes[i] = (TreeNode*)malloc(sizeof(TreeNode));nodes[i]->weight = weights[i];nodes[i]->leftChild = NULL;nodes[i]->rightChild = NULL;}// 构建哈夫曼树while (n > 1) {int minIndex1 = -1, minIndex2 = -1;for (int i = 0; i < n; i++) {if (nodes[i] != NULL) {if (minIndex1 == -1 || nodes[i]->weight < nodes[minIndex1]->weight) {minIndex2 = minIndex1;minIndex1 = i;} else if (minIndex2 == -1 || nodes[i]->weight < nodes[minIndex2]->weight) {minIndex2 = i;}}}TreeNode* newNode =(TreeNode*)malloc(sizeof(TreeNode));newNode->weight = nodes[minIndex1]->weight + nodes[minIndex2]->weight;newNode->leftChild = nodes[minIndex1];newNode->rightChild = nodes[minIndex2];// 将新构建的二叉树加入到原来排序后队列中nodes[minIndex1] = newNode;nodes[minIndex2] = NULL;n--;}return nodes[minIndex1];}```三、哈夫曼编码1. 哈夫曼编码的定义哈夫曼编码是一种前缀编码方式,它将每个字符的编码表示为二进制串。

数据结构哈夫曼树PPT课件

数据结构哈夫曼树PPT课件
第11页/共21页
例:
W(权)={2,4,2,3,3},叶子结点个数,m=5 试设计Huffman树。
14
6
3
3
8
4
4
22
构造的 Huffman树
第12页/共21页
三、哈夫曼树的应用(哈夫曼编码)
在远程通讯中,要将待传字符转换成由二进制组成 的字符串:
设要传送的字符为: 若编码为:A—00 (等长) B—01
重码 000011010
关键:要设计长度不等的编码,则必须使任一字符的编码都不 是另一个字符的编码的前缀。这种编码称作最优前缀编码。
第14页/共21页
设要传送的字符为:
若编码为 :A—0
B—110
C用二叉树设 计二进制前缀
编码
0
1
C0
1
BD
第15页/共21页
ABACCDA
C—10 D---11
ABACCDA
若将编码设计为长度不等的二进制编码,即让待传字符串中出 现次数较多的字符采用尽可能短的编码,则转换的二进制字符 串便可能减少。
第13页/共21页
设要传送的字符为:ABACCDA 若编码为: A—0
B—00 C—1 D---01
ABACCDA
但: 0000 AAAA ABA BB
二、构造哈夫曼树 1.哈夫曼树的定义
在一棵二叉树中,若带权路径长度达到最小,称这样的 二叉树为最优二叉树,也称为哈夫曼树(Huffman tree)。
第3页/共21页
例 有4个结点,权值分别为7,5,2,4,构造有4个叶子结点的二叉树
4d
a 7
n
c
2
WPL
WK LK
k 1

哈夫曼树

实例
字符序列:DATA TRERTER ARE AREA ART 用0、1组合进行编码,希望01串长度最短。 字符集为{A,D,T,R,E},各字母出现的次 数为{6,1,4,6,4} 高频字符,译码尽可能短


一个方案
– – – – – A:10 D:010 T:011 R:11 E:00

基本术语

结点的权
– 在许多实际应用中,常常将树中的某些结 点赋上一个具有一定意义的实数,这个实 数称为该结点的权

结点的带权路径
– 从根结点到结点的路径长度*结点的权
树的带权路径WPL
– 树中所有叶子结点的带权路径长度之和
基本术语

对所有叶子结点i计算 Wi Li

计算WPL
哈夫曼树
最优树/哈夫曼树
(1)与n个权对应的结点构成具有n棵二叉 树的森林F={T1,T2,…,Tn},其中每棵二叉 树Ti都只有一个根结点,左右子树均空 (2)从F中选出根结点权值最小的两棵树 作为一棵树的左右子树,且置新树的根 结点权值为左右子树根结点权值之和 (3)从F中删除这两棵树,将新树加入F (4)重复(2)、(3),直到F中只含一棵树
哈夫曼树
哈夫曼(haffman)树又称为最优二叉树, 它是n个带权叶子结点构成的二叉树中 WPL最小的二叉树。 ??

ቤተ መጻሕፍቲ ባይዱ
– 所有叶子结点的权值均为1(或相等),构 成的二叉树形式? – 在哈夫曼树中叶子结点的权与路径长度的关 系? – 叶子数目已知,结点总数=? – 唯一性?
哈夫曼树—构造(贪心)
ht[m].codify:=“”; for i:=m downto n+1 do begin p:=ht[i].lchild; if p<>0 then ht[p].codify:=ht[i].codify+”0” p:=ht[i].rchild; if p<>0 then ht[p].codify:=ht[i].codify+”1” end;

数据结构-哈夫曼树及其应用


15
40 a
30 b
5
c
10 d
15 e
二、哈夫曼树及其应用
2.哈夫曼树的求解过程 ③实例:已知有5个叶子结点的权值分别为:5 , 15 , 40 , 30 , 10 ;试画出一棵相应的哈夫曼树。
30
40 a
30 b
15
15 e
5
c
10 d
二、哈夫曼树及其应用
2.哈夫曼树的求解过程 ③实例:已知有5个叶子结点的权值分别为:5 , 15 , 40 , 30 , 10 ;试画出一棵相应的哈夫曼树。
WPL=∑wi*li最小的二叉树称为“最优
i=1 n
二叉树”或称为“哈夫曼树”。
二、哈夫曼树及其应用
2.哈夫曼树的值为{w1,w2,...wn},构 造一棵最优二叉树。
二、哈夫曼树及其应用
2.哈夫曼树的求解过程 ②方法:
步骤1:构造一个具有n棵二叉树的森林F={T1,T2,......,Tn}, 其中Ti是只有一个根结点且根结点的权值为wi的二叉树。 步骤2:在F中选取两棵其根结点的权值最小的二叉树,从F 中删除这两棵树,并以这两棵二叉树为左右子树构造一棵 新的二叉树添加到F中,该新的二叉树的根结点的权值为 其左右孩子二叉树的根结点的权值之和。 步骤3:判断F中是否只有唯一的一棵二叉树。若是,则求 解过程结束;否则,转步骤2。
二、哈夫曼树及其应用
3.哈夫曼编码 ②压缩编码:
例如:对于刚才的4个字符的编码问题,可以按如 下不等长编码方案进行编码: A: 0 B: 00 C: 1 D: 01 则对于电文“ABACCDA”的二进制电码为: 000011010 总长为9位 问题:译码时可能出现多意性,即译码不唯一:
二、哈夫曼树及其应用

哈夫曼树


n
(wk—第k个叶结点的权值;pk—第k个叶结点的带权路径长度)
达到最小。
2、最优二叉树的构造方法 假定给出n个结点ki(i=1‥n),其权值分别为wi(i=1‥n)。要构造以此n个 结点为叶结点的最优二叉树,其构造方法如下:
首先,将给定的n个结点构成n棵二叉树的集合F={T1,T2,……,Tn}。其 中每棵二叉树Ti中只有一个权值为wi的根结点ki,其左、右子树均为空。然后 做以下两步
}
测试数据: 输入: 5 75246 输出: 54
3、哈夫曼编码
使用频率高的采用短的的编码,则总的编码长度便可减少.
例如:在某通讯中只使用abcd四种字符,其出现频率分别 为:0.4,0.3,0.2,0.1。请进行哈夫曼编码。使通讯码尽可能 的短
并写出信息:bbdaac的编码。
1.给定一个整数集合{3,5,6,9,12},下列二叉树哪个 是该整数集合对应的霍夫曼(Huffman)树。 ( )
⑴在F中选取根结点权值最小的两棵二叉树作为左右子树,构造一棵新 的二叉树,并且置新的二叉树的根结点的权值为其左、右子树根结点的权值之 和; ⑵在F中删除这两棵二叉树,同时将新得到的二叉树加入F中;
重复⑴、⑵,直到在F中只含有一棵二叉树为止。这棵二叉树便是最优二叉树。 以上构造最优二叉树的方法称为哈夫曼(huffmann)算法。
int data;
int prt, lch, rch; };
//结点的权值
//父指针、左、右孩子指针
node ht[MAXN];
int n,m; int path[LEAF];
//ht[1]..ht[n]为叶结点,ht[n+1]..ht[2n-1]
//n 为读入的叶结点数,m 为总结点数 //叶结点到根的路径长度

数据结构哈夫曼树编码

数据结构哈夫曼树编码一、引言二、哈夫曼树的定义1. 节点的概念2. 哈夫曼树的定义三、哈夫曼编码的概念1. 编码方式2. 码长和平均码长四、哈夫曼编码的实现方法1. 构建哈夫曼树a. 构建思路及步骤b. 构建示例图解2. 编码过程a. 编码步骤及示例图解b. 编码实现代码示例3. 解码过程a. 解码步骤及示例图解b. 解码实现代码示例五、哈夫曼编码的优缺点1. 优点2. 缺点六、应用实例七、总结一、引言:随着信息技术的飞速发展,数据处理已经成为当今社会中一个不可或缺的部分。

在数据处理中,如何高效地压缩数据是一个非常重要的问题。

而哈夫曼树编码作为一种高效的压缩算法,在数据传输和存储方面有着广泛应用。

二、哈夫曼树的定义:1. 节点的概念:哈夫曼树是一种二叉树,由根节点、左子树和右子树组成。

每个节点可以有零个或两个子节点。

叶子节点是指没有子节点的节点,而非叶子节点则至少有一个子节点。

2. 哈夫曼树的定义:哈夫曼树是一种特殊的二叉树,它的所有叶子节点都带有权值。

对于任意一个哈夫曼树,将其所有叶子节点按照权值从小到大排列,则可得到一组序列W={w1,w2,...,wn}。

哈夫曼树的构建过程就是将这组序列转化为一棵二叉树。

三、哈夫曼编码的概念:1. 编码方式:哈夫曼编码是一种前缀编码方式,即每个字符的编码都不是其他字符编码的前缀。

2. 码长和平均码长:对于一个字符c,其在哈夫曼编码中所占用的位数称为其码长Lc。

而整个字符串的平均码长Lavg则是所有字符在哈夫曼编码中所占用位数之和除以字符串长度n。

四、哈夫曼编码的实现方法:1. 构建哈夫曼树a. 构建思路及步骤:(1)将所有字符按照权值从小到大排序,构成初始节点集合。

(2)从节点集合中选出两个权值最小的节点作为左右子节点,构建一棵新的二叉树,并将该二叉树的根节点插入到节点集合中。

(3)重复步骤2,直到只剩下一个节点为止。

b. 构建示例图解:2. 编码过程a. 编码步骤及示例图解:(1)遍历哈夫曼树,对于每个叶子节点记录其路径上所有非叶子节点的左右分支信息,用0表示左分支,用1表示右分支。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构与算法
课程设计报告书

题目: 哈夫曼编码/译码器
班级:
学号: 05
姓名: 田 欢
指导教师: 龚 丹
周期: 2011-12-19至2011-12-23

成绩:
年 月 日
一、课程设计的目的与要求
(一)课程设计目的与任务(参考已发文档自行编辑,但不少于100字)
设计一个利用哈夫曼算法的编码和译码系统,重复地显示并处理以下项目,直
到选择退出为止。利用哈夫曼树编码问题基本原理的应用,撑握对树的不同存储结
构的定义和算法描述。学会构造哈夫曼树和哈夫曼编码等主要算法。
(二)题目要求
1) 将权值数据存放在数据文件(文件名为,位于执行程序的当前目录中)
2) 分别采用动态和静态存储结构
3) 初始化:键盘输入字符集大小n、n个字符和n个权值,建立哈夫曼树;
4) 编码:利用建好的哈夫曼树生成哈夫曼编码;
5) 输出编码;
6) 设字符集及频度如下表:
字符 空格 A B C D E F G H I J K L M
频度 186 64 13 22 32 103 21 15 47 57 1 5 32 20
字符 N O P Q R S T U V W X Y Z
频度 57 63 15 1 48 51 80 23 8 18 1 16 1
二、设计正文
1 系统分析
(1)定义一个变量名为HTNode的结构体,用该结构体中的char data、int

weight、int parent、int lchild、int rchild分别表示哈夫曼树中每个结点的权值、权重、
双亲结点、左孩子、右孩子,再定义一个HTNode类型的数组ht[30]存放哈夫曼树;
另外定义一个变量名为HCode的结构体,采用HCode类型变量的cd[start]~cd[n]存
放当前结点的哈夫曼编码、最后定义一个HCode类型的数组hcd[30]的数组用于存
放当前叶子结点ht[i]的哈夫曼编码。
(2)编写CodeInput(n,ht)函数并在函数中设置一个for(i=0;n;++)循环,首先输
入n个字符,再利用函数中的for(i=0;(3)编写CreateHT(ht,n)函数来构造一棵哈夫曼树,首先用一个
for(i=0;<2*n-1;++)循环将所有2n-1个结点的parent、lchild、rchild域均置初值为-1;
再用一个for(i=n;<2*n-1;++)循环来构造哈夫曼树,在该循环中首先令lnode和rnode
为最小权值的两个结点位置且其域值均为-1,再用一个for(k=0;<=i-1;k++)循环在数
组ht[30]中寻找权值最小的两个结点并且只能在尚未构造二叉树的结点中查找,由
于只能在尚未构造二叉树的结点中查找,因此在for(k=0;k<=i-1;k++)循环中加入一个
if(ht[k].parent==-1)语句来判断结点lnode和rnode是否已经在二叉树中,如果结点
lnode和rnode在二叉树中,则结点lnode和rnode的parent的值为其双亲结点在
数组ht[30]中的序号就不会为-1了,在查找到ht[lnode]和ht[rnode]后将他们作为
ht[i]的左右子树,ht[lnode]和ht[rnode]的双亲结点置为ht[i],且
ht[i].weight=ht[lnode].weight+ht [rnode].weight。如此处理下去,直到所2n-1个结点
处理完毕。
(4)编写CreateHCode(ht,hcd,n)函数来求哈夫曼编码,由于求哈夫曼编码只需
求叶子结点的哈夫曼编码。对于当前叶子结点ht[i],首先将对应的哈夫曼编码hcd[i]
的start域值置初值n,找其双亲结点ht[f],若当前结点是双亲结点的左孩子结点,
则在hcd[i]的cd数组中添加0,若当前结点是双亲的右孩子结点,则在hcd[i]的cd
数组中添加1,将start域减1。再对双亲结点进行同样的操作,直到无双亲结点为
止,最后让start指向哈夫曼编码最开始字符。因此在函数中设置一个for(i=0;i循环,在循环中设置一个while(f!=-1)循环语句来判断循环是否到了根结点,再在
while(f!=-1)中设置一个if(ht[f].lchild==c)语句来判断该处理左孩子结点还是该处理
右孩子结点。最后用这个for(i=0;i(5)最后编写CodeOutput(n,hcd)函数,首先利用for(i=0;ifor(j=hcd[i].start;j<=n;j++)循环来实现所有字符的哈夫曼编码的输出;再利用
for(i=0;i曼编码的输出。
2 功能详细描述及框图
(1)主函数流程图如图
(2)哈夫曼编码算法流程图,如图
(3)构造树函数流程图,如图

Int I,f,c;
i++
++;
multiplex
i=0

=n;c=i;
i

f!=-1

图哈夫曼编码算法流程图

Int i;
scanf(“%d”,&ht[t].we…
i++

i

结束

开始

图主函数流程图
Int k,lnode,mode;

Ht[i].parent=ht[i].child
i++
i=n

Ht[lnode],parent=i;
Min1=min2=32767
Multiplex

i=0;
i<2*2*n-1
i<2*n-1

i++
图构造树函数流程图
3、数据结构设计
3.1抽象数据类型定义

(1)树的抽象数据类型定义
3.2模块划分
本程序包括三个模块:
(1)主程序模块
void main()
{
初始化;
构造哈夫曼树;
求哈夫曼编码;
哈夫曼编码输出;
}
(2)哈夫曼模块——实现哈夫曼树的抽象数据类型
(3)求哈夫曼编码模块——实现求哈夫曼编码算法的数据类型
4、主要功能逻辑过程和实现算法
4.1数据类型的定义
(1)哈夫曼树类型
typedef struct{arent=ht[i].lchild=ht[i].rchild=-1;
for (i=n;i<2*n-1;i++)arent==-1)eight{
min2=min1;rnode=lnode;
min1=ht[k].weight; lnode=k;
}
else if (ht[k].weight{
min2=ht[k].weight; rnode=k;}
}
ht[lnode].parent=i; ht[rnode].parent=i;
ht[i].weight=ht[lnode].weight+ht[rnode].weight;
ht[i].lchild=lnode; ht[i].rchild=rnode;arent;
while (f!=-1)child==c)
[]='0';arent;
}

++;
(2)和同学们细心交流,认真讨论。
(3)上网参考,吸取别人的精华。
2 课程设计期间的主要收获:

通过这次课程设计使我充分的理解了用哈夫曼树再编码问题中基本原理的应
用,知道了树的不同存储结构的定义和算法描述,同时也学会了编写简单的哈夫曼
编码问题的程序。虽然此次的程序不是很完备,但是总体还是一个比较能体现数据
结构知识点的程序,当然只是相对于我这个学者来说。在刚开始编程的时候,我感
到很茫然,无从下手。但是困难是可以解决的,只要通过努力,向老师虚心学习请
教,再难的题目也可以自己动手完成。通过这次的数据结构课程设计,我也深刻了
解到这门学问的博大精深,要积极进取,不断学习,不断积累知识。同时也认识到
自己的不足和缺点,做什么事都需要细心和耐心,并坚持下去,这样才有一个比较
满意的成果。
在此我非常感谢的是我的指导老师,感谢老师的细心认真的辅导,让我对数据
结构这门课程有了更深刻的认识,同时我还要感谢帮助过我的同学,没有他们的帮

0 4F 1 C 6 H 3E 1 0
1

0 1

0
1

0

7 I
2 D

0
1

1

0 B 5 G
0
1

图构造哈夫曼树及哈夫曼编码
助我不肯能完成这样顺利,谢谢!

相关文档
最新文档