Huffman编码源代码

构建Huffman树:

1.将给定的n个权值看作n棵只有结点无左右孩子的二叉树,组合成一个集合HT。

2.从集合HT中选出2棵权值最小的二叉树,组成一棵新的二叉树,其权值为这两棵二叉树的权值之和。

3.将步骤2中选出的二叉树从集合HT中删去,同时将步骤2中新的二叉树加入到集合HT中。

4.重复步骤2和步骤3,直到集合HT中只含有一棵树,这棵树就是Huffman树。

伪代码:

typedefstruct//定义结构体

{

intweight;//保存权值

intparent, lchild, rchild;//保存父节点、左右孩子的节点值

}HuffmanNode, *HuffmanTree;

typedefchar**HuffmanCode;//用来存储哈夫曼编码

procHuffmanCoding(HuffmanTree &HT,int*w,intn)//编码函数定义

if(n <= 1)then Error();

m := 2 * n - 1;//n nodes create huffman tree need 2n-1 nodes

HT:= (HuffmanNode*)malloc((m +1) *sizeof(HuffmanNode));//HT存放Huffman tree的所有节点,申请m+1个位置

memset(HT, 0, (m + 1)*sizeof(HuffmanNode));//对所有节点初始化为0

//setthe n nodes

fori from 1 to n

HT[i].weight := *w++;//初始化各节点的权值

//createHuffman tree

fori from n + 1 to m//从HT的第n+1个位置开始

select(HT, i - 1, s1,s2);//选择剩余节点中权值较小的s1和s2

HT[s1].parent := i;//s1,s2的父节点都是当前结点

HT[s2].parent := i;

HT[i].lchild := s1;

HT[i].rchild := s2;

HT[i].weight :=HT[s1].weight + HT[s2].weight;

end{for}

HC := (HuffmanCode)malloc((n + 1) *sizeof(char*));

char*cd = (char*)malloc(n *sizeof(char));//申请n个位置,最后一位存放结束符

cd[n - 1] ='\0';

fori from 1 to n

start = n - 1;

for(c= i, f = HT[i].parent; f != 0; c = f, f = HT[f].parent)

if(HT[f].lchild == c)

cd[--start] ='0';//cd从后往前依次存放

else

cd[--start] ='1';

end{for}

HC[i] = (char*)malloc((n - start) *sizeof(char));

strcpy(HC[i],&cd[start]);

end{for}

end{proc}




源码:

#include

#include

#include

usingnamespacestd;

/*哈夫曼树的存储结构,它是二叉树*/

typedefstruct

{

intweight;//保存权值

intparent, lchild, rchild;//保存父节点、左右孩子的节点值

}HuffmanNode, *HuffmanTree;

typedefchar**HuffmanCode;//用来存储哈夫曼编码

voidHuffmanCoding(HuffmanTree &HT,int*w,intn);//Huffman编码函数

voidselect(HuffmanTree HT,intn,int&s1,int&s2);//选择书中节点值较小的两个节点

voidError(char*message);//显示错误信息

intmain(intargc,char* argv[])

{

inti,n;

int*w;

HuffmanCode HC;

HuffmanTree HT;

cout<<"Enter the size of the code:";

cin>>n;

w=(int*)malloc(n*sizeof(int));

cout<<"Enter the weight of the code:";

for(i=0;i

cin>>w[i];

cout<<"The Huffmancode is:"<

HuffmanCoding(HT, w, n);

system("pause");

}

voidHuffmanCoding(HuffmanTree &HT,int*w,intn)

{

if(n <= 1)

Error("code is small");

intm = 2 * n - 1;//n nodes create huffman tree need2n-1 nodes

HT = (HuffmanNode*)malloc((m +1) *sizeof(HuffmanNode));//Huffman tree的所有节点

ints1, s2;//record the two mini weights nodes

memset(HT, 0, (m + 1)*sizeof(HuffmanNode));//对所有节点初始化为0

//setthe n nodes

for(inti = 1; i <= n; i++)

{

HT[i].weight = *w++;//初始化各节点权值

}

//创建Huffmantree

for(inti = n + 1; i <= m; ++i)

{

//选择剩余节点中权值较小的s1和s2

select(HT, i - 1, s1,s2);

HT[s1].parent = i;

HT[s2].parent = i;

HT[i].lchild = s1;

HT[i].rchild = s2;

HT[i].weight = HT[s1].weight+ HT[s2].weight;

}

HuffmanCode HC;

intstart, c, f;

HC = (HuffmanCode)malloc((n + 1)*sizeof(char*));

char*cd = (char*)malloc(n *sizeof(char));

cd[n - 1] ='\0';

for(inti = 1; i <= n; ++i)

{

start = n - 1;

for(c= i, f = HT[i].parent; f != 0; c = f, f = HT[f].parent)

if(HT[f].lchild == c)

cd[--start] ='0';

else

cd[--start] ='1';

HC[i] = (char*)malloc((n - start) *sizeof(char));

strcpy(HC[i],&cd[start]);

}

for(inti = 1; i <= n; i++)

{

cout<

}

free(cd);

free(HC);

free(HT);

}

voidError(char*message)

{

fprintf(stderr,"Error: %s(5s will exit)",message);

cout<<"\n";

Sleep(5000);

exit(1);

}

voidselect(HuffmanTree HT,intn,int&s1,int&s2)

{

s1 = 1;

s2 = 1;

intmin= 99999;

inti;

//选择未被使用的第一个节点,

for(i = 1; i <= n; ++i)

{

if(HT[i].parent == 0)

{

min = HT[i].weight;

break;

}

}

//findthe mini s1

for(intp =1; p <= n; ++p)

{

if(0== HT[p].parent && min >= HT[p].weight)

{

s1 = p;

min = HT[p].weight;

}

}

//findthe s2

min = 99999;

for(intq =1; q <= n; ++q)

{

if(0== HT[q].parent && min >= HT[q].weight )

{

if(q == s1)

continue;

s2 = q;

min = HT[q].weight;

}

}

}

运行结果示例:


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,924评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,781评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,813评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,264评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,273评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,383评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,800评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,482评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,673评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,497评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,545评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,240评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,802评论 3 304
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,866评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,101评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,673评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,245评论 2 341

推荐阅读更多精彩内容