关于哈夫曼编码的一道题

来源:百度知道 编辑:UC知道 时间:2024/05/18 06:51:26
假定用于通信的报文仅由8个字母:a,b,c,d,e,f,g,h组成,各字母在电文中出现的频率分别为5,25,3,6,10,11,36,4.试为这8个字母设计哈夫曼编码,给出相应的哈夫曼树,原电文压缩存储的总空间?并给出报文“abefhgeadcbb”的总码数?

Huffman编码:数据通信用的二进制编码
编码:根据字符出现频率构造Huffman树,然后将树中结点引向其左孩子的分支标“0”,引向其右孩子的分支标“1”;每个字符的编码即为从根到每个叶子的路径上得到的0、1序列.
例 要传输的字符集 D={C,A,S,T, ; }
字符出现频率 w={ 2,4, 2, 3, 3}

T : 00
; : 01
A : 10
C : 110
S : 111

例 电文是{CAS;CAT}
其编码 “11010111011101000”

下面是我写的一个程序,希望能满意。
#include<iostream>
using namespace std;

struct htnode
{
char ch;
int weight;
int parent;
int lchild,rchild;
};

class huffmantree
{
public:
void code(char str1[],int w[],int n);
void uncode(char str1[],char str2[],int n);
private:
htnode ht[3000];
void creathuffmantree(char str1[],int w[],int n);
void select(int pos,int &r1,int &r2);
};

void huffmantree::select(int pos,int &r1,int &r2)
{
r1=r2=0;
for(int i=1;i<=pos;i++)
{
if(ht[i].parent!=0)