二叉树的应用实验报告
数据结构实验报告——二叉树
实 验 报 告
课程名称 ____数据结构上机实验__________ 实验项目 ______二叉树的应用 ____________ 实验仪器 ________PC机___________________
系 别____________________________
专 业_____________________________
班级/学号____________________________ 学生姓名 _____________________________ 实验日期 _______________________
成 绩 _______________________
指导教师 _______________________
数据结构实验报告——二叉树
实验三.二叉树的应用
1. 实验目的:掌握二叉树的链式存储结构和常用算法。利用哈夫曼树设计最优压缩编码。
2. 实验内容:
1) 编写函数,实现建立哈夫曼树和显示哈夫曼树的功能。
2) 编写函数,实现生成哈夫曼编码的功能。
3) 编写主函数,从终端输入一段英文文本;统计各个字符出现的频率,然后构建哈夫曼树并求出对应的哈夫曼编码;显示哈夫曼树和哈夫曼编码。
选做内容:修改程序,选择实现以下功能:
4) 编码:用哈夫曼编码对一段英文文本进行压缩编码,显示编码后的文本编码序列;
5) 统计:计算并显示文本的压缩比例;
6) 解码:将采用哈夫曼编码压缩的文本还原为英文文本。
3. 算法说明:
1) 二叉树和哈夫曼树的相关算法见讲义。
2) 编码的方法是:从头开始逐个读取文本字符串中的每个字符,查编码表得到它的编码并输出。重复处理直至文本结束。
3) 解码的方法是:将指针指向哈夫曼树的树根,从头开始逐个读取编码序列中的每位,若该位为1则向右子树走,为
数据结构实验报告——二叉树
0则向左子树走。当走到叶子节点时,取出节点中的字符并输出。重新将指针放到树根,继续以上过程直至编码序列处理完毕。
4) 压缩比例的计算:编码后的文本长度为编码序列中的0和1,的个数,原文本长度为字符数*8。两者之比即为压缩比。
4. 实验步骤:
实现哈夫曼树的编码序列操作:
int i=0,j=0;
huffnode p;
p=tree[2*n-2];//序号2*n-2节点就是树根节点
while(hfmstr[i]!='\0')//从头开始扫描每个字符,直到结束 {while(p.lchild!=-1&&p.rchild!=-1)
if(hfmstr[i]=='0')//为0则向左子树走
{
p=tree[p.lchild];//取出叶子节点中的字符
}
else if(hfmstr[i]=='1')//为1则向右子树走
{
p=tree[p.rchild];//取出叶子节点中的字符
}
i++;
}
数据结构实验报告——二叉树
decodestr[j]=p.data;j++;//对字符进行译码,结果放在decodestr字符串中
p=tree[2*n-2];//返回根节点
}
}
程序修改后完整源代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>//专门用于检测整型数据数据类型的表达值范围
#define N 96 //ASCII字符集包含至多N个可见字符 typedef struct //Huffman树节点定义
{ char data; //字符值
int weight; //权重
int lchild; //左子结点
int rchild; //右子结点
} huffnode; //huffman节点类型
struct charcode
{ int count; //字符出现的次数(频率)
char code[N]; //字符的Huffman编码
} codeset[N]; //编码表,长为N,每项对应一个ascii码字符,下标
数据结构实验报告——二叉树
i的项对应ascii编码为i+32的字符
huffnode * CreateHufftree(char data[], int weight[], int n) //建立Huffman树的算法
{
int i,k;
int min1,min2,min_i1,min_i2;
huffnode *tree;
tree=(huffnode *)malloc((2*n-1)*sizeof(huffnode)); //为Huffman树分配2n-1个节点空间
for (i=0;i<2*n-1;i++) //初始化,将各字符和其频率填入Huffman树,作为叶子结点
{
tree[i].lchild=tree[i].rchild=-1;
if (i<n) {
tree[i].data=data[i];
tree[i].weight=weight[i];
}
else tree[i].data=' ';
}
for (i=n;i<2*n-1;i++) ////合并两棵树,作n-1遍
{
min1=min2=INT_MAX; //INT_MAX为最大值
数据结构实验报告——二叉树
min_i1=min_i2=-1;
for (k=0;k<i;k++) ////查找定位两个最小权重节点 if (tree[k].weight>=0) //仅在根节点中找
if (tree[k].weight<min1)
{
min2=min1;
min_i2=min_i1;
min1=tree[k].weight;
min_i1=k;
}
else
if (tree[k].weight<min2) {
min2=tree[k].weight;
min_i2=k;
}
tree[i].weight=min1+min2;
tree[min_i1].weight *= -1;
tree[min_i2].weight *= -1;
tree[i].lchild=min_i1;
tree[i].rchild=min_i2;
}
return tree; // 合并
数据结构实验报告——二叉树
}
void CreateHuffcode(huffnode tree[], int i, char s[])//已知tree[i]节点的编码序列为s,求该节点下所有叶子节点的编码序列。 { char s1[N],c;
if(i!=-1)
if (tree[i].lchild==-1 && tree[i].rchild==-1) {
c=tree[i].data;
strcpy(codeset[c-32].code, s);
}
else {
strcpy(s1, s); strcat(s1, "0");
CreateHuffcode(tree, tree[i].lchild, s1);
strcpy(s1, s); strcat(s1, "1");
CreateHuffcode(tree, tree[i].rchild, s1);
}
return;
}
void PrintHufftree(huffnode tree[], int n)
Huffman树
{
int i;
printf("Huffman tree :\n"); //输出tree中的
数据结构实验报告——二叉树
printf("i\tValue\tLchild\tRchild\tWeight\n");
for(i=2*n-2;i>=0;i--)
{
printf("%d\t",i);
printf("%c\t",tree[i].data);
printf("%d\t",tree[i].lchild);
printf("%d\t",tree[i].rchild);
printf("%d\t",tree[i].weight);
printf("\n");
}
}
void EnCoding(char str[], char hfmstr[])
{//根据codeset编码表,逐个将str字符串中的字符转化为它的huffman编码,结果编码串放在hfmstr字符串中
int i, j;
hfmstr[0]='\0';//把hfmstr串赋空
i=0;
while(str[i]!='\0')//从第头开始扫描str的每个字符,一直到该字符的结束
{
j=str[i]-32;//执行字符到huffman的转换
strcat(hfmstr, codeset[j].code);//把codest编码串添加到hfmstr
数据结构实验报告——二叉树
结尾处
i++;//每次循环完i的值加1
}
}
void DeCoding(huffnode tree[], int n, char hfmstr[], char decodestr[])
//根据tree数组中的huffman树,逐个对hfmstr字符串中的字 …… 此处隐藏:3411字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [资格考试]石油钻采专业设备项目可行性研究报告编
- [资格考试]2012-2013学年度第二学期麻风病防治知
- [资格考试]道路勘测设计 绪论
- [资格考试]控烟戒烟知识培训资料
- [资格考试]建设工程安全生产管理(三类人员安全员
- [资格考试]photoshop制作茶叶包装盒步骤平面效果
- [资格考试]授课进度计划表封面(09-10下施工)
- [资格考试]麦肯锡卓越工作方法读后感
- [资格考试]2007年广西区农村信用社招聘考试试题
- [资格考试]软件实施工程师笔试题
- [资格考试]2014年初三数学复习专练第一章 数与式(
- [资格考试]中国糯玉米汁饮料市场发展概况及投资战
- [资格考试]塑钢门窗安装((专项方案)15)
- [资格考试]初中数学答题卡模板2
- [资格考试]2015-2020年中国效率手册行业市场调查
- [资格考试]华北电力大学学习实践活动领导小组办公
- [资格考试]溃疡性结肠炎研究的新进展
- [资格考试]人教版高中语文1—5册(必修)背诵篇目名
- [资格考试]ISO9001-2018质量管理体系最新版标准
- [资格考试]论文之希尔顿酒店集团进入中国的战略研
- 全国中小学生转学申请表
- 《奇迹暖暖》17-支2文学少女小满(9)公
- 2019-2020学年八年级地理下册 第六章
- 2005年高考试题——英语(天津卷)
- 无纺布耐磨测试方法及标准
- 建筑工程施工劳动力安排计划
- (目录)中国中央空调行业市场深度调研分
- 中国期货价格期限结构模型实证分析
- AutoCAD 2016基础教程第2章 AutoCAD基
- 2014-2015学年西城初三期末数学试题及
- 机械加工工艺基础(完整版)
- 归因理论在管理中的应用[1]0
- 突破瓶颈 实现医院可持续发展
- 2014年南京师范大学商学院决策学招生目
- 现浇箱梁支架预压报告
- Excel_2010函数图表入门与实战
- 人教版新课标初中数学 13.1 轴对称 (
- Visual Basic 6.0程序设计教程电子教案
- 2010北京助理工程师考试复习《建筑施工
- 国外5大医疗互联网模式分析




