description
根據傳送的一串字元出現的頻率,設定其相應的哈夫曼編碼
input
一串字元
output
哈夫曼編碼(按照中序遍歷輸出各個字母和編碼,中間用冒號分開)
sample input
xinnnmm
sample output
n:0
m:10
x:110
i:111
哈夫曼樹:
1.記錄每個字元出現的次數,並且記錄這個字元。
2.去重複字元。
3.建哈夫曼樹。
4.訪問輸出。
注意:
相同大小時不是排字元而是排它在序列中出現的先後順序。
type
arr=record
data:longint;
l,r:longint;
addr:longint;
zm:char;
end;
var f,a:array [0..101] of arr;
g:array ['a'..'z'] of longint;
i,j,t,n,sum,x:longint;
s:string;
procedure
mp(k:longint);
var i,j:longint;
t:arr;
begin
for i:=1
to k-1
dofor 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
t:=a[i];
a[i]:=a[j];
a[j]:=t;
end;
end;
procedure
vist
(o:string;t:longint);
begin
if f[t].data=0
then
exit;
vist(o+'0',f[t].l);
vist(o+'1',f[t].r);
if f[t].l=0
then
if f[t].r=0
then writeln(f[t].zm,':',o);
end;
begin
readln(s);
for i:=1
to length(s) do inc(g[s[i]]);
for i:=1
to length(s) do
if g[s[i]]>0
then
begin
inc(n);
a[n].data:=g[s[i]];
f[n].data:=g[s[i]];
a[n].addr:=n;
a[n].zm:=s[i];
f[n].zm:=s[i];
g[s[i]]:=0;
end;
t:=n+1; i:=n;
while i>1
dobegin
mp(i);
f[t].data:=a[1].data+a[2].data;
f[t].l:=a[1].addr;
f[t].r:=a[2].addr;
a[2].zm:=a[i].zm;
a[i].zm:=chr(200);
a[1].zm:=chr(200);
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.
SSL 1409 樹 哈夫曼樹 三
time limit 1000ms memory limit 65536k 根據傳送的一串字元出現的頻率,設定其相應的哈夫曼編碼 一串字元 哈夫曼編碼 按照中序遍歷輸出各個字母和編碼,中間用冒號分開,按照左子樹根節點的頻率小於等於右子樹根節點的頻率的次序構造,若頻率相同,左子樹根節點的首次出現位置小...
哈夫曼樹,赫夫曼樹
參考 赫夫曼樹,別名 哈夫曼樹 最優樹 以及 最優二叉樹 當用 n 個結點 這些結點都作為葉子結點且都有各自的權值 試圖構建一棵樹時,如果構建的這棵樹的帶權路徑長度最小,稱這棵樹為 最優二叉樹 有時也叫 赫夫曼樹 或者 哈夫曼樹 構建哈夫曼樹 在 n 個權值中選出兩個最小的權值,對應的兩個結點組成乙...
哈夫曼樹 牛客 哈夫曼樹
哈夫曼樹,第一行輸入乙個數n,表示葉結點的個數。需要用這些葉結點生成哈夫曼樹,根據哈夫曼樹的概念,這些結點有權值,即weight,題目需要輸出所有結點的值與權值的乘積之和。輸入有多組資料。每組第一行輸入乙個數n,接著輸入n個葉節點 葉節點權值不超過100,2 n 1000 輸出權值。示例1 5 1 ...