SSL P1409 樹 哈夫曼樹 三

2021-07-25 13:38:41 字數 2014 閱讀 2899

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