第十一周 项目一 - 二叉树的算法验证(4)哈夫曼树
来源:互联网 发布:求关键路径的算法步骤 编辑:程序博客网 时间:2024/06/06 07:06
/*
Copyright (c)2015,烟台大学计算机与控制工程学院
All rights reserved.
文件名称:二叉树算法验证.cpp
作 者:林颖
完成日期:2016年11月7日
版 本 号:v1.0
问题描述: 运行并重复测试教学内容中涉及的算法。改变测试数据进行重复测试的意义在于,可以从更多角度体会算法,以达到逐渐掌握算法的程度。使用你的测试数据,并展示测试结果,观察运行结果,以此来领会算法。
输入描述: 若干测试数据。
程序输出: 对应数据的输出。
Copyright (c)2015,烟台大学计算机与控制工程学院
All rights reserved.
文件名称:二叉树算法验证.cpp
作 者:林颖
完成日期:2016年11月7日
版 本 号:v1.0
问题描述: 运行并重复测试教学内容中涉及的算法。改变测试数据进行重复测试的意义在于,可以从更多角度体会算法,以达到逐渐掌握算法的程度。使用你的测试数据,并展示测试结果,观察运行结果,以此来领会算法。
输入描述: 若干测试数据。
程序输出: 对应数据的输出。
*/
#include <stdio.h> #include <string.h> #define N 50 //叶子结点数 #define M 2*N-1 //树中结点总数 //哈夫曼树的节点结构类型 typedef struct { char data; //结点值 double weight; //权重 int parent; //双亲结点 int lchild; //左孩子结点 int rchild; //右孩子结点 } HTNode; //每个节点哈夫曼编码的结构类型 typedef struct { char cd[N]; //存放哈夫曼码 int start; } HCode; //构造哈夫曼树 void CreateHT(HTNode ht[],int n) { int i,k,lnode,rnode; double min1,min2; for (i=0; i<2*n-1; i++) //所有结点的相关域置初值-1 ht[i].parent=ht[i].lchild=ht[i].rchild=-1; for (i=n; i<2*n-1; i++) //构造哈夫曼树 { min1=min2=32767; //lnode和rnode为最小权重的两个结点位置 lnode=rnode=-1; for (k=0; k<=i-1; k++) if (ht[k].parent==-1) //只在尚未构造二叉树的结点中查找 { if (ht[k].weight<min1) { min2=min1; rnode=lnode; min1=ht[k].weight; lnode=k; } else if (ht[k].weight<min2) { min2=ht[k].weight; rnode=k; } } ht[i].weight=ht[lnode].weight+ht[rnode].weight; ht[i].lchild=lnode; ht[i].rchild=rnode; ht[lnode].parent=i; ht[rnode].parent=i; } } //实现哈夫曼编码 void CreateHCode(HTNode ht[],HCode hcd[],int n) { int i,f,c; HCode hc; for (i=0; i<n; i++) //根据哈夫曼树求哈夫曼编码 { hc.start=n; c=i; f=ht[i].parent; while (f!=-1) //循序直到树根结点 { if (ht[f].lchild==c) //处理左孩子结点 hc.cd[hc.start--]='0'; else //处理右孩子结点 hc.cd[hc.start--]='1'; c=f; f=ht[f].parent; } hc.start++; //start指向哈夫曼编码最开始字符 hcd[i]=hc; } } //输出哈夫曼编码 void DispHCode(HTNode ht[],HCode hcd[],int n) { int i,k; double sum=0,m=0; int j; printf(" 输出哈夫曼编码:\n"); //输出哈夫曼编码 for (i=0; i<n; i++) { j=0; printf(" %c:\t",ht[i].data); for (k=hcd[i].start; k<=n; k++) { printf("%c",hcd[i].cd[k]); j++; } m+=ht[i].weight; sum+=ht[i].weight*j; printf("\n"); } printf("\n 平均长度=%g\n",1.0*sum/m); } int main() { int n=8,i; //n表示初始字符串的个数 char str[]= {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}; double fnum[]= {0.07,0.19,0.02,0.06,0.32,0.03,0.21,0.1}; HTNode ht[M]; HCode hcd[N]; for (i=0; i<n; i++) { ht[i].data=str[i]; ht[i].weight=fnum[i]; } printf("\n"); CreateHT(ht,n); CreateHCode(ht,hcd,n); DispHCode(ht,hcd,n); printf("\n"); return 0; }运行结果
知识点总结:
哈夫曼树。
学习心得:
哈夫曼树是一个难点,他其实是一个最优二叉树,通过知原理的哈夫曼树练习,我对哈夫曼树的理解更加深刻。
0 0
- 第十一周 项目一 - 二叉树的算法验证(4)哈夫曼树
- 第十一周项目一-二叉树算法验证(2)二叉树构造算法的验证
- 第十一周 项目一 -二叉树算法验证(2)二叉树构造算法的验证
- 第十一周--项目一二叉树算法验证(一)
- 第十一周项目一二叉树构造算法的验证
- 第十一周--项目1 - 二叉树算法验证(4)哈夫曼树编码的算法验证
- 第十一周--项目一二叉树算法验证(二)
- 第十一周--项目一二叉树算法验证(三)
- 第十一周--项目一二叉树算法验证(四)
- 第十一周项目一-二叉树算法验证(层次便利算法的验证)
- 第十一周项目一(1)二叉树算法验证-层次遍历算法的验证
- 第十一周项目一:验证算法(2)二叉树构造算法的验证
- 第十一周 项目一 -二叉树算法验证(1)层次遍历算法的验证
- 第十一周-项目一 验证算法(2)二叉树构造算法的验证
- 第十一周项目一 -验证算法(2)二叉树构造算法的验证
- 第十一周项目4—二叉树算法验证哈夫曼树
- 第十一周项目1-二叉树算法验证(4)
- 第十一周项目1--二叉树算法验证(4)
- 怎么解决Qt5中文显示乱码问题
- JAD反编译详细介绍
- groovy : poi 读取 Excel xlsx
- Android测试环境搭建
- java基础6_面向对象
- 第十一周 项目一 - 二叉树的算法验证(4)哈夫曼树
- 数据库连接池使用过程问题总结(实现连接并操作数据库最简单的方法)
- faster rcnn +GPU+配置+训练
- mysql 错误码: 1267
- 最大子串搜和索算法
- 页面内容不足以铺满屏幕高度时,footer居底显示
- 极验验证码的破解-开篇
- 浅谈sql中的in与not in,exists与not exists的区别
- Android RTMP直播(续二)