p(247)赫夫曼编码
2016-03-28 17:42
239 查看
算法主要在做的事就是从堆中取出两个元素合并成一个新元素,再插入堆中,同时构建二叉树
注意堆中要存下二叉树元素的地址,方便引用
#include<stdio.h> #include<stdlib.h> struct node{ int f; struct node *l,*r; }; struct heap{ int f; struct node *hnode; }; int minheapify(struct heap *q,int i,int heapsize) { int min; struct heap tmp; tmp=q[i]; while (1) { min=i; if (i*2<=heapsize) min=tmp.f<q[i*2].f?i:i*2; if (i*2+1<=heapsize) min=q[min].f<q[i*2+1].f?min:i*2+1; if (min!=i) { q[i]=q[min]; i=min; } else break; } q[min]=tmp; return 0; } int buildminheap(struct heap*q,int heapsize) { int i; for (i=heapsize/2;i>=1;i--) minheapify(q,i,heapsize); return 0; } struct node * extractmin(struct heap *q,int heapsize) { struct heap tmp; tmp=q[1]; q[1]=q[heapsize]; minheapify(q,1,heapsize-1); return tmp.hnode; } int insert(struct heap *q,struct node *new,int heapsize) { struct heap tmp; int min,i; heapsize++; q[heapsize].f=new->f; q[heapsize].hnode=new; tmp=q[heapsize]; i=heapsize; while (1) { min=i; if ((i>1)&&(q[i/2].f>tmp.f)) min=i/2; if (min!=i) { q[i]=q[min]; i=min; } else break; } q[min]=tmp; return 0; } struct node * huffman(struct heap *q,int n) { int i; struct node *new; for (i=n;i>1;i--)//heapsize { new=(struct node *)malloc(sizeof(struct node)); new->l=extractmin(q,i); new->r=extractmin(q,i-1); new->f=new->l->f+new->r->f; insert(q,new,i-2); } return new; } int print(struct node *root) { if (root==NULL) { printf("# "); return 0; } printf("%d ",root->f); print(root->l); print(root->r); return 0; } int main(void) { int n,i; struct heap* q; scanf("%d",&n); q=(struct heap *)malloc(sizeof(struct heap)*(n+1)); for (i=1;i<=n;i++) { q[i].hnode=(struct node *)malloc(sizeof(struct node)); q[i].hnode->l=NULL; q[i].hnode->r=NULL; scanf("%d",&q[i].f); q[i].hnode->f=q[i].f; } buildminheap(q,n); struct node *hroot; hroot=huffman(q,n); print(hroot); return 0; }
相关文章推荐
- Handler,Looper&&在异步线程中更新UI
- 基于TCP实现简单的客户端服务端的消息传递
- C#使用正则表达式检测数字 char 和韩文
- Android通过HttpURLConnection链接到网络,并获取网络数据
- Windows 安装Kafka
- [JAVA · 初级]:12.内部类
- 安卓的动画效果分析
- Activiti简单示例入门
- 值类型引用类型图解
- 23个Facebook Paper中的设计细节
- 使用unbound在RHEL7上搭建DNS服务
- SpringMVC与Struts2的主要区别
- iOS导入第三方库步骤-CocoaPods
- flash画图API:解析obj格式
- 使用SqlBuilder生成SQL语句
- BZOJ3172单词
- eclipse android开发 错误提示:path for project must only have one segment
- 面向对象设计的SOLID原则
- 运维工程师必须掌握的基础技能有哪些?
- SQL字符串转换为数组