【树】哈夫曼树(三)
Time Limit:1000MS Memory Limit:65536K
Total Submit:51 Accepted:29
Description
根据传送的一串字符出现的频率,设置其相应的哈夫曼编码
Input
一串字符
Output
哈夫曼编码(按照中序遍历输出各个字母和编码,中间用冒号分开)
Sample Input
XINNNMM
Sample Output
N:0
M:10
X:110
I:111
统计频率后建立哈弗曼树
const maxn=100; type arr=record data:longint; l,r:longint; addr:longint; ch:char; end; var i,j,t,n,k:longint; f,a,b:array[0..maxn] of arr; fl:array['A'..'Z'] of boolean; sum:array['A'..'Z'] of longint; s:string; procedure sort(k:longint); var i,j:longint; begin for i:=1 to k-1 do for j:=i+1 to k do if (a[i].data>a[j].data) or (a[i].data=a[j].data) and (a[i].addr>a[j].addr) then begin a[0]:=a[i]; a[i]:=a[j]; a[j]:=a[0]; end; end; procedure vist(ans:string;t:longint); begin if f[t].data=0 then exit; vist(ans+'0',f[t].l); if (f[t].l=0) and (f[t].r=0) then writeln(f[t].ch,':',ans); vist(ans+'1',f[t].r); end; begin readln(s); n:=length(s); for i:=1 to n do inc(sum[s[i]]); j:=0; for i:=1 to n do begin if (not fl[s[i]]) then begin inc(j); a[j].data:=sum[s[i]]; f[j].data:=a[j].data; a[j].addr:=j; a[j].ch:=s[i]; f[j].ch:=s[i]; fl[s[i]]:=true; end; end; i:=j; t:=j+1; while i>1 do begin sort(i); f[t].data:=a[1].data+a[2].data; a[2].ch:=a[i].ch; a[i].ch:=chr(110+t); a[1].ch:=chr(110+t); f[t].l:=a[1].addr; f[t].r:=a[2].addr; a[1].data:=f[t].data; a[1].addr:=t; a[2].data:=a[i].data; a[2].addr:=a[i].addr; inc(t); dec(i); end; vist('',t-1); end.