第十周项目实践 哈夫曼树的建立&&哈夫曼编码
2017-11-01 13:17
351 查看
typedef struct { char date; int lchild,rchild; int parent; }HTnode; void CreateHTnode(HTnode ht[],int n) { int min1,min2,lnode,rnode; for(int i=0;i<2*n-1;++i)//所有节点的相关值置为-1 { ht[i].prent=ht[i].lchild=ht[i].rchild-1; } for(int i=n;i<2*n-1;++i)//构造哈夫曼树 { min1=min2=inf; lnode=rnode=-1;//代表2个最小权重的节点位置 for(int j=0;j<i;++j)//在【0,i)中寻找最小权重的节点 { if(ht[j].praent=-1)//在先前尚未找过的节点中进行查找 { if(ht[j].date<min1)//判断是否是左节点 { min2=min1,rnode=lnode; min1=ht[j].date,lnode=j; } else if(ht[j].date<min2)//判断是否是右节点。基于思想,不能写成else 也不能写成if { min2=ht[j].date,rnode=j; } } } //双亲节点的处理: ht[i].date=ht[lnode].date+ht[rnode].date; ht[i].lchild=lnode,ht[i].rchild=rnode; ht[lnode].parent=ht[rnode].parent=i; } }数据结构李春葆第五版P239 哈夫曼编码:
typedef struct { char cd ;//存放当前节点的哈夫曼吗 int start;//表示cd[start...n0]部分是哈夫曼码 //因为哈夫曼树中每个叶子节点的哈夫曼编码长度不同,为此采用HCode类型的变量的cd[start..n0]存放当前结点的哈夫曼码 }HCode; void createHCode(HTNode ht[],Hcode hcd[],int n0) { Hcode hc; int c,f; for(int i=0;i<n0;++i)//根据哈夫曼树求哈夫曼码 { hc.start=n0,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; } }
相关文章推荐
- 第8周实践项目2-建立链串的算法库
- 第十周上机实践项目——1000以内所有偶数的和
- Asp.Net MVC && SmartDAL项目实践(二) 简单结构搭建
- 第十周上机实践项目——乘法口诀表。
- 数据结构上机实践第四周项目1 - 建立单链表数
- Python & 机器学习之项目实践
- 微型项目实践(10):Master & Default
- 第十周第十一周上机实践项目-项目1-(1)-点-圆-圆柱类族的设计
- 第四周实践项目4 建立算法库——双链表
- SVN – 搭建 SVN 服务器 && 多项目分别建立版本库 && 同步至生产环境
- 第十周 【项目1 - 哈夫曼编码的算法验证(4)】
- 第8周实践项目2 - 建立链串的算法库
- *第十周*数据结构实践项目一【二叉树的链式存储算法库】
- 第十周项目一-建立二叉树算法库
- 第14周-输入输出流,文本文件-项目0-课后实践·程序阅读1
- 第十周实践项目3--利用二叉树遍历思想解决问题
- 哈夫曼树的建立以及哈夫曼编码
- 第十周第十一周上机实践项目-项目3-1-警察和厨师
- 第十周实践项目2 二叉树遍历的递归算法
- 一个Web报表项目的性能分析和优化实践(四):MySQL建立索引,唯一索引和组合索引