樹 哈夫曼樹 二

2021-07-25 08:21:57 字數 2456 閱讀 7012

【樹】哈夫曼樹(二)

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

7

a 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....