【树】哈夫曼树(三)

【树】哈夫曼树(三)

Time Limit:1000MS  Memory Limit:65536K
Total Submit:51 Accepted:29

Description

根据传送的一串字符出现的频率,设置其相应的哈夫曼编码

Input

一串字符

Output

哈夫曼编码(按照中序遍历输出各个字母和编码,中间用冒号分开)

Sample Input

XINNNMM

Sample Output

N:0
M:10
X:110
I:111

统计频率后建立哈弗曼树


 
 
  • const
      maxn=100;
    type
      arr=record
        data:longint;
        l,r:longint;
        addr:longint;
        ch:char;
      end;
    var
      i,j,t,n,k:longint;
      f,a,b:array[0..maxn] of arr;
      fl:array['A'..'Z'] of boolean;
      sum:array['A'..'Z'] of longint;
      s:string;
    
    procedure sort(k:longint);
    var
      i,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].addr>a[j].addr) then
            begin
              a[0]:=a[i];
              a[i]:=a[j];
              a[j]:=a[0];
            end;
    end;
    
    procedure vist(ans:string;t:longint);
    begin
      if f[t].data=0 then exit;
      vist(ans+'0',f[t].l);
      if (f[t].l=0) and (f[t].r=0) then writeln(f[t].ch,':',ans);
      vist(ans+'1',f[t].r);
    
    end;
    
    begin
      readln(s);
      n:=length(s);
      for i:=1 to n do
        inc(sum[s[i]]);
      j:=0;
      for i:=1 to n do
        begin
          if (not fl[s[i]])  then
            begin
              inc(j);
              a[j].data:=sum[s[i]];
              f[j].data:=a[j].data;
              a[j].addr:=j;
              a[j].ch:=s[i];
              f[j].ch:=s[i];
              fl[s[i]]:=true;
            end;
        end;
      i:=j;
      t:=j+1;
      while i>1 do
        begin
          sort(i);
          f[t].data:=a[1].data+a[2].data;
          a[2].ch:=a[i].ch;
          a[i].ch:=chr(110+t);
          a[1].ch:=chr(110+t);
          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.
    
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值