您的位置:首页 > 其它

哈夫曼树以及哈夫曼编码 .

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];

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: