哈夫曼树以及哈夫曼编码 .
2013-05-23 12:01
387 查看
#include <iostream> #include <string.h> using namespace std; #define N 1000 struct HufmTree//哈夫曼树 { char ch;//结点字符 int weight;//结点的权值 int parent,lchild,rchild; }; struct HuffmanCode { char ch; char bits[N+1]; }; HufmTree tree ;//哈夫曼树 HuffmanCode h ;//哈夫曼编码 void select(HufmTree tree[],int n,int&min1,int &min2) //选出parent 的值为0且权值最小的两个结点 { int mw1=100000,mw2=100000; for(int i=1;i<=n;i++) { if(tree[i].parent!=0)continue; if(tree[i].weight<=mw1) { mw2=mw1; mw1=tree[i].weight; min2=min1; min1=i; } else if(tree[i].weight<mw2) { mw2=tree[i].weight; min2=i; } } } void CreatHuffman(HufmTree *tree,int n)//n为结点个数 { if(n<=1)return; int m=2*n; for(int i =1;i<m;i++)//初始化结点 { tree[i].parent=0; tree[i].lchild=0; tree[i].rchild=0; tree[i].weight=0; } for(int i=1;i<=n;i++)//读入结点 { cin>>tree[i].ch; cin>>tree[i].weight; } for(int i=n+1;i<m;i++) { int min1,min2;//min1,min2,保存权值最小的两个结点的下标 select(tree,i-1,min1,min2); tree[min1].parent=i;tree[min2].parent=i; tree[i].lchild=min1;tree[i].rchild=min2; tree[i].weight= tree[min1].weight + tree[min2].weight ; } } void HuffmanCoding(HufmTree *tree,HuffmanCode*h,int n)//n为结点个数 { int c,p; int start; char cd[n+1]; cd ='\0'; for(int i=1;i<=n;i++) { h[i].ch=tree[i].ch; start = n; c=i; p=tree[c].parent; while(p==tree[c].parent) { if(tree[p].lchild==c)// 如果tree[c]是tree[p]的左孩子,则生成代码‘0’ cd[--start]='0'; else cd[--start]='1'; c=p; if(p==2*n-1)break; else p=tree[p].parent; } for(int j=start;j<=n;j++) { h[i].bits[j-start]=cd[j]; } } }
相关文章推荐
- 哈夫曼树的构建以及哈夫曼编码的输出
- 哈夫曼树以及哈夫曼编码
- [置顶] 树:哈夫曼树和哈夫曼编码的详细介绍以及代码实现
- 哈夫曼树以及哈夫曼编码
- 哈夫曼树以及哈夫曼编码
- 哈夫曼树以及哈夫曼编码的问题
- 哈夫曼树以及哈夫曼编码
- 哈夫曼树以及哈夫曼编码的创建
- 数据结构(15)--哈夫曼树以及哈夫曼编码的实现
- 哈夫曼树的建立以及哈夫曼编码
- 哈夫曼编码、哈夫曼树构建、哈夫曼树Java实现
- 哈夫曼树和哈夫曼编码
- C++构建哈夫曼树,并输出哈夫曼编码
- 哈夫曼树和哈夫曼编码
- 哈夫曼树的构造以及编码
- 创建哈夫曼树并进行哈夫曼编码与哈夫曼译码
- 哈夫曼树和哈夫曼编码
- 哈夫曼树与哈夫曼编码
- 哈夫曼树与哈夫曼编码
- 数据结构之构造哈夫曼树及哈夫曼编码