- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
PAGE
PAGE 1
《数据结构》课程设计
题目:赫夫曼树的建立
一、需求分析
众所周知,最优二叉树(赫夫曼树)在解决很多判定问题时,有着无可比拟的优势。同时,在目前,进行快速远距离通信的主要手段主要是电报,即将需传送的文字转换成由二进制的字符组成的字符串。而在文字的转换编码中,也必然要用到赫夫曼算法才能使传送的电文尽可能地短。
所以,本程序主要目的就是是利用赫夫曼算法快速生成一个普通二叉树的最优二叉树(赫夫曼树),同时本程序还可以生成对每个结点对应的赫夫曼编码。
在这个程序中主要有3个函数:
InitHaffman函数:完成对树的结点进行初始化。
Haffman函数:用于构造赫夫曼树并生成相应的赫夫曼编码。
OutputHaffman函数:输出赫夫曼树和编码。
二、概要设计
赫夫曼算法的叙述过程:
(1)根据给定的n个权值{w1,w2,……,wn}构成n棵二叉树的集合F={T1,T2,……,Tn},其中每棵二叉树Ti中只有一个带权为wi的根结点,其左右子树均空。
(2)在F中选取两棵根结点的权值最小的树作为左右子树构造一棵新的二叉树,且置新的二叉树的根结点的权值为其左、右子树上根结点的权值之和。
(3)在F中删除这两棵树,同时将新得到的二叉树加入F中。
(4)重复(2)和(3),直到F 只含一棵树为止。这棵树便是赫夫曼树。
程序大体设计流程:
定义全局变量构造赫夫曼树的存储结构定义InitHaffman函数定义
定义全局变量
构造赫夫曼树
的存储结构
定义InitHaffman函数
定义Haffman函数
定义OutputHaffman函数
利用主程序调用函数
typedef struct
{
int data; //结点值
int Weight; //权值
int Flag; //标识是否待构结点 ,是的话用0表示,否则为1
int Parent; //父结点
int Lchild; //左结点
int Rchild; //右结点
}hnodetype;
2、构造树初始化的函数InitHaffman
三、详细设计
1、定义程序所需的全局变量,以便在程序中使用。代码如下:
#define MAXVALUE 10000
#define MAXLEAF 30
#define MAXNODE 60
#define MAXBIT 10
2、构建赫夫曼树的存储结构。赫夫曼树中主要包括结点个数,每个结点对应的权值,父结点及左右孩子结点这几个元素。所以其存储结构的可以表示代码如下:
typedef struct
{
int data; //结点值
int Weight; //权值
int Flag; //标识是否待构结点 ,是的话用0表示,否则为1
int Parent; //父结点
int Lchild; //左结点
int Rchild; //右结点
}hnodetype;
3、编写赫夫曼树结点初使化函数。主要是使用for循环来实现,详细代码如下所示:
void InitHaffman(hnodetype HuffNode[],hcodetype HuffCode[],int n)
{
int i;
for(i=0;i=2*n-1;i++) //把生成的结点初始化,把指向父亲的指针先置空
{
HuffNode[i].Weight=0;
HuffNode[i].Parent=0;
HuffNode[i].Flag=0;
HuffNode[i].Lchild=-1;
HuffNode[i].Rchild=-1;
}
for(i=0;in;i++) //输入树的结点
{
getchar();
printf(输入第%d个叶结点值:,i+1);
scanf(%c,HuffNode[i].data);
}
printf(\n);
for(i=0;in;i++) //输入树结点对应的权值
{
getchar();
printf(输入第%d个叶子结点对应的权值:,i+1);
scanf(%d,HuffNode[i].Weight);
}
printf(\n);
}
4、构造赫夫曼树函数。按照赫夫曼算法,我们先找对应权值最小的两个结点,再将这两个结点提出构成一个二叉树,此二叉树的根权值为两子结点权值之和,再将此根结点和其它结点权值比较,找最小的两个权对应结点,再构成一个二叉树……。以此类推最后就能得出所要的赫夫曼树。
对于每一父子间,约定其左孩子则为字符0,右孩子为字符1。则可以从根结点到叶子结点的路径上分支组成的字符串作为该叶子结点字符的编码,就可以输出每个叶子结点的赫夫曼编码。主要代码如
文档评论(0)