数据结构赫夫曼二叉树的应用.docx
- 文档编号:11303035
- 上传时间:2023-02-26
- 格式:DOCX
- 页数:14
- 大小:159.21KB
数据结构赫夫曼二叉树的应用.docx
《数据结构赫夫曼二叉树的应用.docx》由会员分享,可在线阅读,更多相关《数据结构赫夫曼二叉树的应用.docx(14页珍藏版)》请在冰豆网上搜索。
数据结构赫夫曼二叉树的应用
班级:
学号:
姓名:
同组人员:
指导老师:
课程设计报告
题目:
二叉树的应用
一、程序设计目标
1、问题描述
a)输入一字符序列的权值;
b)构建赫夫曼树;
c)求每个自符的赫夫曼编码,并输出。
2、问题分析
赫夫曼树,又称最优树,是一类带权路径长度最短的树。
那么如何构造一颗赫夫曼树呢?
赫夫曼最早给出了一个带有一般规律的算法,俗称赫夫曼算法。
现叙述如下:
(1)根据给定的n个权值{w1,w2,w3,……,wn}构成n棵二叉树的集合F={T1,T2,T3,……,Tn},其中每棵二叉树Ti中只有一个带权为wi的根结点,其左右子树均空。
(2)在F中选取两棵根结点的权值最小的树作为左右子树构造一棵新的二叉树,且置新的二叉树的根结点的权值为其左、右子树上根结点的权值之和。
(3)在F中删除这棵树,同时将新得到的二叉树加入F中。
(4)重复
(2)(3),直到F只含一棵树为止。
这棵树便是赫夫曼树。
由于在构成赫夫曼树之后,为求编码需从叶子结点出发走一条从叶子到根的路径;而为译码需从根出发走一条从根到叶子的路径。
则对每个结点而言,既须知道双亲的信息,又需知道孩子结点的信息。
二、概要设计
1、方案确定
(1)建立最优二叉树函数
首先要先建立一个存储二叉树的结构体,存储结点。
//-----------二叉树的顺序存储表示--------------
#defineMAX-TREE-SIZE100//二叉树的最大结点数
TypedefTELemtypesqbitree[MAX-TREE-SIZE];//0号单元存储根结点
sqBiTreebt
(2)输入赫夫曼树元素的个数
用键盘输入任意数字,用以确定赫夫曼树的权值个数,以便于输出个权值的赫夫曼编码。
(3)确定赫夫曼编码
通过程序的运行,能够输出所输入权值的赫夫曼编码。
2.程序设计模块连接图
3.模块功能说明
Select()选取函数挑选出所有所有结点中权值较小的结点,并将最小的两个结点的权值相加得到一个新的权值,并将该权值纳入下一步的select运算中。
HuffmanCoding()存放这些结点的权值并构造赫夫曼的树以及输出每个结点的赫夫曼编码。
Struct在内存中开辟一个结点的空间,是将所有的将要输入的权值添加进赫夫曼树的基础。
该程序主要是在huffmanCoding部分实现赫夫曼树的建立,首先将所有的输入的权值存放在struct开辟的结点空间中,然后调用select函数实现权值最小的结点的查找,之后以最小的那两个结点分别为左子树和右子树,然后不断调用select函数和将得到的最小值作为左右子树构建起赫夫曼树。
赫夫曼编码的实现是现开辟一个存储空间,然后从叶子起,如果判断该叶子是位于其双亲结点的左或者右孩子来决定其编码为0或者1,存储。
在找到根结点之后,结束。
然后反向输出即可。
三、详细设计
1.数据设计
结点的定义
typedefstruct
{
intweight;//权值
intparent,lchild,rchild;//双亲,左右孩子
}HTNode,*HuffmanTree;
通过定义该位置的权值,双亲,左右孩子来定义一个结点。
2.流程框图
总函数
Select函数
四、C源程序清单
//预定义
#include
#include
#include
#include
#include
#defineMAX_LENGTH100
typedefchar**HuffmanCode;
//数据结构
typedefstruct
{
intweight;//权值
intparent,lchild,rchild;//双亲,左右孩子
}HTNode,*HuffmanTree;
//select函数
voidSelect(HuffmanTreeHT,inti,int&s1,int&s2)
//在建立赫夫曼树的所有结点中选择权值最小的两个结点存放在s1,s2中
{
intj,k=1;
while(HT[k].parent!
=0)
k++;
s1=k;
for(j=1;j<=i;++j)
if(HT[j].parent==0&&HT[j].weight s1=j; k=1; while((HT[k].parent! =0||k==s1)) k++; s2=k; for(j=1;j<=i;++j) if(HT[j].parent==0&&HT[j].weight =s1) s2=j; } //构建赫夫曼树 voidHuffmanCoding(HuffmanTree&HT,HuffmanCode&HC,int*w,intn) { intm,i,s1,s2,start,c,f; HuffmanTreep; if(n<=1) return; m=2*n-1;//由得到的叶子数而计算结点总数 HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));//分配存储空间 for(p=HT+1,i=1;i<=n;++i,++p,++w) { p->weight=*w;//为结点初始化权值 p->parent=0; p->lchild=0; p->rchild=0; } for(;i<=m;++i,++p) { p->weight=0; p->parent=0; p->lchild=0; p->rchild=0; }//初始化双亲和左右孩子,使他们成为孤立的 for(i=n+1;i<=m;++i) { Select(HT,i-1,s1,s2);//调用select函数 HT[s1].parent=HT[s2].parent=i; HT[i].lchild=s1; HT[i].rchild=s2; HT[i].weight=HT[s1].weight+HT[s2].weight;//新结点的权值是s1和s2权值的和 } //赫夫曼编码 HC=(HuffmanCode)malloc((n+1)*sizeof(char*)); char*cd; cd=(char*)malloc(n*sizeof(char)); cd[n-1]='\0'; cout< "< for(i=1;i<=n;++i)//从底下往上寻回编码 { start=n-1; for(c=i,f=HT[i].parent;f! =0;c=f,f=HT[f].parent) if(HT[f].lchild==c) cd[--start]='0'; else cd[--start]='1'; HC[i]=(char*)malloc((n-start)*sizeof(char)); strcpy(HC[i],&cd[start]); cout<<"HT[i]Huffmancodeis: "< } free(cd); }; //主函数部分 voidmain() { HuffmanTreeHT; HuffmanCodeHC; intn,i; int*w,W[MAX_LENGTH]; cout<<"***********本程序实现的是赫夫曼树的建立以及编码*********"; cout< "; cin>>n; cout<<"请输入各元素的权值: "< for(i=0;i { cout<<"HT["< cin>>W[i]; } w=W; HuffmanCoding(HT,HC,w,n); } 五、调试分析和测试结果 程序开始运行是要求输入赫夫曼树元素的个数: 假设输入元素个数为4,则输出: 输入四个权值,回车则输出赫夫曼编码: 测试结果: 该程序能够完整运行,输入一串权值能够输出赫夫曼编码。 六、心得体会 课程设计是培养学生综合运用所学知识,发现提出分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际能力的具体训练和考察过程。 回顾数据设计这些日子,至今我感慨颇多,的确,学到了很多的东西包括以前在课本上没有学到的知识,还使我懂的了理论和时间结合的重要性。 包括从前期的准备到后期的制作以及和同学们之间的交流和互动,是我深深了解到一个团队的重要性和团结的重要意义。 在本次课程设计过程中,我们也遇到了很多的问题。 在编写代码的过程中也查找了很多相关的资料。 我发现网上的很多知识是我们平常在课堂上没有办法学到的,有很多的东西需要亲自动手操作之后才能真正了解它的含义和内容。 在借鉴了很多书籍和代码的帮助下我们终于顺利完成了本次的课程设计。 通过这次课程设计,我加深了对数据结构这门课程的理解,也进一步学习了二叉树和赫夫曼树(最优二叉树)的知识。 进一步加深了对数据结构的学习的兴趣。 虽然此次我们仅仅编写了有关二叉树的编码,但是并不代表我们对数据结构知识面的狭窄性。 通过这次实例证明,我们每个人只要肯付出努力和汗水,就能够得到自己耕耘出的美好的果实的。 七、参考文献 《数据结构C语言》 严蔚敏 清华大学出版社 《c语言程序设计》 谭浩强 清华大学出版社 《数据结构习题》 李春保 清华大学出版社 《数据结构习题》 严蔚敏 清华大学出版社 《c语言与数据结构》王立柱 清华大学出版社 《数据结构(C语言篇)习题与解析》李春葆清华大学出版社
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 赫夫曼 二叉 应用