哈夫曼树的建立 源程序+注释+运行结果
来源:互联网 发布:银行网络银行现状 编辑:程序博客网 时间:2024/05/21 14:03
#include<stdio.h>#define MAXLEN 100typedef struct // 定义结构体{ int weight; // 定义一个整型权值变量 int lchild,rchild,parent; // 定义左、右孩子及双亲指针}HTNode;typedef HTNode HFMT[MAXLEN]; // 定义一个结构数组类型int n; // 定义一个全局变量存储权值个数void inithfmt(HFMT T){ int i; printf("\n\t\t 请输入共有多少个权值(小于100):"); scanf("%d",&n); getchar(); for(i=0;i<2*n-1;i++) { T[i].weight=0; T[i].lchild=-1; T[i].rchild=-1; T[i].parent=-1; }}void inputweight(HFMT T){ int w; int i; for(i=0;i<n;i++) { printf("\n\t\t 输入第%d个权值:",i+1); scanf("%d",&w);getchar(); T[i].weight=w; }}void selectmin(HFMT T,int i,int *p1,int *p2) // 选择两个权值最小的结点{ // 预设两个值,并使它大于可能出现的最大权值 long min1=999999; long min2=999999; int j; for(j=0;j<=i;j++) //从前面下标为 0 到 n-1 的结点中 { if(T[j].parent==-1) //并且是在parent值为-1的结点中 { if(min1>T[j].weight) //找出最小的权值 { min1=T[j].weight; *p1=j; //通过*p1带回序号 } } } for(j=0;j<=i;j++) //从前面下标为 0 到 n-1 的结点中 { if(T[j].parent==-1) //并且是在parent值为-1的结点中 { if( min2>T[j].weight && j!=(*p1) ) { min2=T[j].weight; //找出次最小的权值 *p2=j; //通过*p2带回序号 } } }}void creathfmt(HFMT T) //构造哈夫曼树,T[2*n-2]为其根结点{ int i,p1,p2; inithfmt(T); inputweight(T); for(i=n;i<2*n-1;i++) //权值的个数为n,即哈夫曼树的叶子结点数为n个,分别从T[0]到T[n-1]。 //从T[n]开始构造其他结点。 { selectmin(T,i-1,&p1,&p2); // 从前面下标为 0 到 n-1 的结点中,并且是在parent值为-1的结点中, // 挑出两个权值最小的结点,并由p1,p2带回结点的下标序号。 T[p1].parent=T[p2].parent=i; T[i].lchild=p1; //权值最小的结点作为左子树 T[i].rchild=p2; //权值次小的结点作为右子树 T[i].weight=T[p1].weight+T[p2].weight; }}void printhfmt(HFMT T) //输出哈夫曼树。只输出构造结点。{ int i,k=0; for(i=0;i<2*n-1;i++) while( T[i].lchild!=-1 ) { if( !(k%2) ) printf("\n"); printf("\t\t %d %d %d %d \n",T[i].lchild,T[i].rchild,T[i].weight,T[i].parent); k++; break; }}void main(){ HFMT HT; creathfmt(HT); printhfmt(HT);}
运行结果:
0 0
- 哈夫曼树的建立 源程序+注释+运行结果
- 新建数据库源程序界面运行结果展示
- Java源程序的运行
- erlang源程序文件的注释
- 取得源程序预处理后的结果
- 十大建立网站的开源程序
- LCC编译器的源程序分析(59)代码生成的源程序注释
- [转载]LCC编译器的源程序分析(59)代码生成的源程序注释
- OpenCV中Canny边缘检测源程序的注释
- 使用 PHPDocumentor 建立源程序文档
- LCC编译器的源程序分析(64)符号表的结构注释
- LCC编译器的源程序分析(65)后端接口的结构注释
- [转载] LCC编译器的源程序分析(64)符号表的结构注释
- [转载]LCC编译器的源程序分析(65)后端接口的结构注释
- LCC编译器的源程序分析(65)后端接口的结构注释
- LCC编译器的源程序分析(64)符号表的结构注释
- LCC编译器的源程序分析(64)符号表的结构注释
- LCC编译器的源程序分析(65)后端接口的结构注释
- java实现七种排序 (插入排序, 希尔排序, 插入排序, 快速排序, 简单选择排序, 堆排序, 归并排序)
- Node.js基础一 环境配置、JS基础、创建WebSite
- Bootstrap里的文件作用
- 【初始化块】 类里的第4种成员(除Field、方法和构造器)
- HDU 5273
- 哈夫曼树的建立 源程序+注释+运行结果
- Stars(一定要看,树状数组差点问线问题)
- cocos2d-x 菜鸟实习生学习篇-菜单坐标
- POJ水题1083区间重叠问题
- Rails遗留数据库访问之一动态ORM
- leetcode--Minimum Size Subarray Sum
- 线性表子系统
- OpenCV实现图像搜索引擎(Image Search Engine)
- cocos2dx常见49种Action