哈弗曼编码大家一定很熟悉吧(不熟悉也没关系,自己查去。。。)。现在给你一串字符以及它们所对应的权值,让你构造哈弗曼树,从而确定每个字符的哈弗曼编码。当然,这里有一些小规定:
1.规定哈弗曼树的左子树编码为0,右子树编码为1;
2.若两个字符权值相同,则ASCII码值小的字符为左孩子,大的为右孩子;
3.创建的新节点所代表的字符与它的左孩子的字符相同;
4.所有字符为ASCII码表上32-96之间的字符(即“ ”到“`”之间的字符)。
3 a 10 b 5 c 8 4 a 1 b 1 c 1 d 1
a:0 b:10 c:11 a:00 b:01 c:10 d:11
分析:
万恶的哈夫曼,完全不理解啊,我什么时候可以把它给搞清楚啊,那么都变量,那么多变化,
都不知道数据结构怎么就这么难呢
虽然是抄的代码,但还是要保存一下的,为了以后可以好好地研究一下
001.
#include<stdio.h>
002.
#include<string.h>
003.
#include<algorithm>
004.
#define INF 99999999;
005.
using
namespace
std;
006.
struct
f
007.
{
008.
char
ch,*str;
009.
int
w,p,l,r;
010.
} num[200];
011.
int
main()
012.
{
013.
int
m,n,min1,min2,s1,s2,i,j,s,c,q;
014.
char
*cd;
015.
while
(
scanf
(
"%d"
,&n)!=EOF)
016.
{
017.
for
(i=1; i<=n; i++)
018.
{
019.
getchar
();
020.
scanf
(
"%c%d"
,&num[i].ch,&num[i].w);
021.
num[i].p=num[i].l=num[i].r=0;
022.
}
023.
m=2*n;
024.
for
(i=n+1; i<m; i++)
025.
num[i].w=num[i].p=num[i].l=num[i].r=0;
026.
//构造哈夫曼树
027.
for
(i=n+1; i<m; i++)
028.
{
029.
min1=min2=INF;
030.
s1=s2=0;
031.
for
(j=1; j<=i-1; j++)
032.
{
033.
034.
if
(num[j].p!=0)
035.
continue
;
036.
if
(min1>num[j].w)
037.
{
038.
min2=min1;
039.
min1=num[j].w;
040.
s2=s1;
041.
s1=j;
042.
}
043.
else
if
(min1==num[j].w&&num[s1].ch>num[j].ch)
044.
{
045.
min2=min1;
046.
min1=num[j].w;
047.
s2=s1;
048.
s1=j;
049.
}
050.
else
if
(min2>num[j].w)
051.
{
052.
min2=num[j].w;
053.
s2=j;
054.
}
055.
else
if
(min2==num[j].w&&num[s2].ch>num[j].ch)
056.
{
057.
min2=num[j].w;
058.
s2=j;
059.
}
060.
}
061.
num[i].w=num[s1].w+num[s2].w;
062.
num[s1].p=i;
063.
num[s2].p=i;
064.
if
(num[s1].w==num[s2].w)
065.
{
066.
if
(num[s1].ch>num[s2].ch)
067.
{
068.
num[i].ch=num[s2].ch;
069.
num[i].l=s2;
070.
num[i].r=s1;
071.
}
072.
if
(num[s1].ch<num[s2].ch)
073.
{
074.
num[i].ch=num[s1].ch;
075.
num[i].l=s1;
076.
num[i].r=s2;
077.
}
078.
}
079.
else
080.
{
081.
num[i].ch=num[s1].ch;
082.
num[i].l=s1;
083.
num[i].r=s2;
084.
}
085.
}
086.
cd=(
char
*)
malloc
(n*
sizeof
(
char
));
087.
cd[n-1]=
'\0'
;
088.
for
(i=1; i<=n; i++)
089.
{
090.
s=n-1;
091.
c=i;
092.
q=num[i].p;
093.
while
(q!=0)
094.
{
095.
--s;
096.
if
(num[q].l==c)
097.
cd[s]=
'0'
;
098.
else
099.
cd[s]=
'1'
;
100.
c=q;
101.
q=num[q].p;
102.
}
103.
num[i].str=(
char
*)
malloc
((n-s)*
sizeof
(
char
));
104.
strcpy
(num[i].str,&cd[s]);
105.
}
106.
free
(cd);
107.
for
(i=1; i<=n; i++)
108.
printf
(
"%c:%s\n"
,num[i].ch,num[i].str);
109.
}
110.
return
0;
111.
}