哈夫曼树以及哈夫曼编码 .
来源:互联网 发布:外国人评论中国淘宝 编辑:程序博客网 时间:2024/05/16 18:35
#include <iostream>#include <string.h>using namespace std;#define N 1000struct HufmTree//哈夫曼树{ char ch;//结点字符 int weight;//结点的权值 int parent,lchild,rchild;};struct HuffmanCode{ char ch; char bits[N+1];};HufmTree tree[N];//哈夫曼树HuffmanCode h[N];//哈夫曼编码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[n]='\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]; } }}