SSL P1407【树】哈夫曼树(一)

来源:互联网 发布:freebsd python 编辑:程序博客网 时间:2024/06/05 21:03

Description

假设用于通信的电文仅由8个字母组成,字母在电文中出现的频率分别为7、19、2、6、32、3、21、10。试为这8个字母设计哈夫曼编码。如果用二进制数表示这8个字母的编码方案.(请按照左子树根节点的权小于等于右子树根节点的权的次序构造)

Input

第一行为字母的个数n;
第二行至第n+1行分别为各个字母在电文中出现的频率;

Output

按照中序遍历输出各个编码

Sample Input

8
7
19
2
6
32
3
21
10
Sample Output

19:00
21:01
2:10000
3:10001
6:1001
7:1010
10:1011
32:11

时间复杂度吗 O(n^2)
哈夫曼树:
1.选取其根结点的权值为最小的两棵二叉树,分别作为左、右子树构造一棵新的二叉树。
2.置这棵新的二叉树根结点的权值为其左、右子树根结点的权值之和。
3.去这两棵树,同时加入刚生成的新树。
4.重复以上步骤,直到只含一棵树为止。

type  arr=record         data:longint;         l,r:longint;         addr:longint;      end;var     f,a:array[0..201] of arr;     i,j,t,n:longint;procedure mp(k:longint);var  i,j:longint;  t:arr;begin   for i:=1 to k-1 do       for j:=i+1 to k do           if a[i].data>a[j].data              then begin                      t:=a[i];                      a[i]:=a[j];                      a[j]:=t;                   end;end;procedure vist(ans:string;t:longint);begin   if f[t].data=0 then exit;   vist(ans+'0',f[t].l); vist(ans+'1',f[t].r);   if f[t].l=0 then      if f[t].r=0 then writeln(f[t].data,':',ans);end;begin   readln(n);   for i:=1 to n do   begin      readln(a[i].data);      f[i].data:=a[i].data;      a[i].addr:=i;   end;  t:=n+1; i:=n;  while i>1 do        begin           mp(i);           f[t].data:=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;           inc(t); dec(i);     end;    vist('',t-1);end.
1 0
原创粉丝点击