【樹】哈夫曼樹(二)
time limit:1000ms memory limit:65536k
total submit:47 accepted:30
description
有n(n<=26)個帶權結點,從a開始的n個字母分別表示這n個結點,他們分別代n個權值,試以它們為葉子結點構造一棵哈夫曼樹(請按照左子樹根節點的權小於等於右子樹根節點的權的次序構造,若兩結點相等時,按照字典順序分別為左子樹和右子樹)。 最後求出該哈夫曼樹的帶權路徑長度.
input
第一行為乙個n的值;第二行為n個字母,中間用空格分開;第三行為n個數字,分別表示著n個字母代表的數值.
output
共計n+1行,前n行分別為按照字母表的順序輸出各個字母和編碼,中間用冒號分開,第n+1行為該哈夫曼樹的帶權路徑長度
sample input
sample output
7a b c d e f g
3 7 8 2 5 8 4
hint
a:1101
b:111
c:00
d:1100
e:101
f:01
g:100
100
和哈弗曼樹(一)差不多,多加乙個域f.ch表示該結點的字母
const
maxn=100;
type
arr=record
data,l,r,addr:longint;
ch:char;
end;
varans,i,j,t,n:longint;
x:char;
f,a:array[0..maxn] of arr;
p:array['a'..'z'] of string;
c:string;
procedure sort(k:longint);
vari,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].ch>a[j].ch) then
begin
a[0]:=a[i];
a[i]:=a[j];
a[j]:=a[0];
end;
end;
procedure vist(s:string;i:longint);
begin
if f[i].data=0 then exit;
vist(s+'0',f[i].l);
if (f[i].l=0) and (f[i].r=0) then p[f[i].ch]:=s;
vist(s+'1',f[i].r);
end;
begin
readln(n);
readln(c);
j:=0;
for i:=1 to length(c) do
if c[i] in ['a'..'z'] then
begin
inc(j);
a[j].ch:=c[i];
f[j].ch:=c[i];
end;
for i:=1 to n do
begin
read(a[i].data);
f[i].data:=a[i].data;
a[i].addr:=i;
end;
i:=n;
t:=n+1;
while i>1 do
begin
sort(i);
f[t].data:=a[1].data+a[2].data;
inc(ans,a[1].data+a[2].data);
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;
a[1].ch:=chr(110+t);
a[2].ch:=a[i].ch;
a[i].ch:=chr(110+t);
inc(t);dec(i);
end;
vist('',t-1);
for x:='a' to 'z' do
if p[x]<>'' then writeln(x,':',p[x]);
writeln(ans);
end.
哈夫曼樹,赫夫曼樹
參考 赫夫曼樹,別名 哈夫曼樹 最優樹 以及 最優二叉樹 當用 n 個結點 這些結點都作為葉子結點且都有各自的權值 試圖構建一棵樹時,如果構建的這棵樹的帶權路徑長度最小,稱這棵樹為 最優二叉樹 有時也叫 赫夫曼樹 或者 哈夫曼樹 構建哈夫曼樹 在 n 個權值中選出兩個最小的權值,對應的兩個結點組成乙...
哈夫曼樹 牛客 哈夫曼樹
哈夫曼樹,第一行輸入乙個數n,表示葉結點的個數。需要用這些葉結點生成哈夫曼樹,根據哈夫曼樹的概念,這些結點有權值,即weight,題目需要輸出所有結點的值與權值的乘積之和。輸入有多組資料。每組第一行輸入乙個數n,接著輸入n個葉節點 葉節點權值不超過100,2 n 1000 輸出權值。示例1 5 1 ...
哈夫曼編碼 哈夫曼樹
1.定義 哈夫曼編碼主要用於資料壓縮。哈夫曼編碼是一種可變長編碼。該編碼將出現頻率高的字元,使用短編碼 將出現頻率低的字元,使用長編碼。變長編碼的主要問題是,必須實現非字首編碼,即在乙個字符集中,任何乙個字元的編碼都不是另乙個字元編碼的字首。如 0 10就是非字首編碼,而0 01不是非字首編碼。2....