#918. 数据结构/二叉树/huffman编码
数据结构/二叉树/huffman编码
说明
实验原理:
哈夫曼树(Huffman)——带权路径长度最短的树.....此处省略200字
实验步骤:
1.实现树结点的定义。
2.实现树的定义,包含的方法有创建树,编码字符串,解码字符串。
输入格式
每组测试用例由四行组成:
第一行是一个字符串,表示字符集;
第二行是每个字符对应的权值,每个权值大于1小于1000;
第三行是一个编码前的字符串;
第四行是一个编码后的字符串。
输出格式
每组测试用例需要输出两行:
第一行是对输入的第三行的编码;
第二行是对输入的第四行的解码。
CAST;
2 4 2 3 3
CAST;
1101000
110101110001
CAT
提示
1、结点结构体可以定义如下:
struct TreeNode{
int parent;//父结点
int lchild;//左孩子
int rchild;//右孩子
int weight;//结点权重
char ch; //字符,非0即叶子结点,输出时可以由此判断
char code;//编码,改结点是父结点的左孩子时为'0',右孩子时为'1'
TreeNode()
{
parent=lchild=rchild=0;
ch=0;
}
};
2、树的定义可以如下:
#define N 32
struct HuffmanTree
{
TreeNode table[N+N-1];
int nLeaves;//叶子结点数量
void CreateTree(char chars[],int weights[])
{//根据字符集以及每个字符的权值创建树
nLeaves=strlen(chars);
//TODO:请自行完成
}
void EncodeChar(char ch)
{//TODO:编码单个字符
}
void EncodeString(char *str)
{//TODO:编码字符串
char ch;
while(ch=*str++)//逐个编码每个字符
EncodeChar(ch);
printf("\n");
}
void DecodeString(char *codes)
{//TODO:解码字符串
printf("\n");
}
};
3、测试用例可以参考:
int main(){
int weights[]={2,4,2,3,3};
tree.CreateTree("CAST;",weights);
tree.EncodeString("CAST;");//期待输出为110101110001
tree.DecodeString("1101000");//期待输出为CAT
return 0;
}