问题描述
给出数据,构建哈夫曼树。(按中序遍历输出)
样例输入
8
7
19
2
6
32
3
21
10
样例输出
19:00
21:01
2:10000
3:10001
6:1001
7:1010
10:1011
32:11
算法讨论
将构建哈夫曼树的模板敲上去就能对了。如何构建哈夫曼树?先将数据从小到大排序,将每个数据当做一棵子树,将最小的两个合并成一棵子树,再次排序,如此重复直到只剩一颗树。最终得到的就是一棵哈夫曼树。
const
maxn=100;
var
a:array[0..maxn,1..2] of longint;
f:array[0..maxn,1..3] of longint;
v:array[0..maxn] of longint;
i,j,n,t:longint;
flag:boolean;
procedure sort(k:longint);
var
i,j,t:longint;
begin
for i:=1 to k-1 do
for j:=i+1 to k do
if a[i,1]>a[j,1]
then begin
t:=a[i,1]; a[i,1]:=a[j,1]; a[j,1]:=t;
t:=a[i,2]; a[i,2]:=a[j,2]; a[j,2]:=t
end;
end;
procedure vist(t:longint);
var
j:longint;
begin
if f[t,1]=0
then begin
flag:=true;
exit
end;
v[i]:=0;
inc(i);
vist(f[t,2]);
dec(i);
v[i]:=1;
inc(i);
vist(f[t,3]);
dec(i);
v[i]:=-1;
if flag
then begin
write(f[t,1],':');
for j:=1 to i-1 do
write(v[j]);
writeln;
flag:=false
end;
end;
begin
read(n);
for i:=1 to n do
begin
read(a[i,1]);
f[i,1]:=a[i,1];
a[i,2]:=i
end;
t:=n+1;
i:=n;
while i>1 do
begin
sort(i);
f[t,1]:=a[1,1]+a[2,1];
f[t,2]:=a[1,2];
f[t,3]:=a[2,2];
a[1,1]:=f[t,1];
a[1,2]:=t;
a[2,1]:=a[i,1];
a[2,2]:=a[i,2];
inc(t); dec(i)
end;
fillchar(v,sizeof(v),255);
i:=1;
vist(t-1)
end.
Pixiv ID:60481857