数据结构Huffman算法的内容
#include<iostream>
#include<string.h>
using namespace std;
typedef char **Huffmancode;//动态分配数组存储哈夫曼编码表
/*
首先要注意如何创建哈弗曼树 和哈夫曼树的构成
以权值为2 4 5 5 7构造为例子
选出最小的 2 4 2+4=6 删除 2 4 目前剩下 5 5 6 7
再选出最小的 5 5 5+5=10 删除 5 5 目前剩下 6 7 10
选出 6 7 6+7=13 删除 6 7 剩下 10 13
10+13=23
构造结束
穿插下标的转换
*/
//哈夫曼树的存储
typedef struct{
int weight;//节点的权重
int parent,lchild,rchild;//节点的双亲 左、右孩子下标
}HTNode,*HuffmanTree; //动态分配数组存储哈夫曼树
//Select 重点 对应void CreateHuffmanTree(HuffmanTree &HT,int n) 里的Select
void Select(HuffmanTree HT,int m,int *s1,int *s2)
{//从这m个数里边选择最小的2个
int i;//从下标为1的位置开始计数
int min1=1000;
int min2=1000;//规定一个特别大的数
for(i=1;i<=m;i++)
{
if(HT[i].parent==0&&min1>HT[i].weight)
{
min1=HT[i].weight;
*s1=i;
}
}
for(i=1;i<=m;i++)
{//注意这个I!=*s1标记min
if(i!=(*s1)&&HT[i].parent==0)
if(HT[i].weight<min2)
{
min2=HT[i].weight;
*s2=i;
}
}
}
//构造哈夫曼树
void CreateHuffmanTree(HuffmanTree &HT,int n)
{
if(n<=1)
{
cout<<"输入的整数小于2 不符合"<<endl;
return ;
}
int m=2*n-1;//一棵n个节点的哈夫曼树有2n-1个节点
HT=new HTNode[m+1];//第0号单元没用 1~2n-1 这是为了方便实现代码
for(int i=1;i<=m;i++)
{
HT[i].parent=0;
HT[i].rchild=0;
HT[i].lchild=0;
}
cout<<"输入前n个单元中叶子节点的权值"<<endl;
for(int i=1;i<=n;i++)
{
cin>>HT[i].weight;//输入的是权值
}
/*初始化操作完成 开始创建哈夫曼树*/
int s1,s2;
for(int i=n+1;i<=m;i++)
{//通过n-1次的选择 删除 合并来创建哈夫曼树
Select(HT,i-1,&s1,&s2);
//在HT[k](k 在 1~i-1)中选择两个其双亲域为0且权值最小的
HT[s1].parent=i; HT[s2].parent=i;
//得到新结点i,从森林中删除s1,s2,将s1和s2的parent由0改为1
HT[i].lchild=s1; HT[i].rchild=s2; //s1 s2作为i的左右孩子
HT[i].weight=HT[s1].weight+HT[s2].weight; //i的权值作为左右孩子权值之和
}
}
void CreatHuffmanCode(HuffmanTree HT,Huffmancode &HC,int n)
{//从叶子到根逆向求每个字符的哈夫曼编码 存储在HC表中
HC=new char*[n+1]; //存储空间
char *cd=new char[n];
cd[n-1]='\0';
int start,c,f;
for(int i=1;i<=n;i++)//逐个字符求哈夫曼代码
{
start=n-1;
c=i; f=HT[i].parent;
while(f!=0)//从叶子节点开始向上回溯 直到根节点结束
{
--start;
if(HT[f].lchild==c) cd[start]='0';
else cd[start]='1';
c=f; f=HT[f].parent;
}
HC[i]=new char[n-start];
strcpy(HC[i],&cd[start]);
}
delete cd;
} /哈夫曼编码实现完毕
int main(){
HuffmanTree HT;
Huffmancode HC;
cout<<"请输入你要输入的信息数"<<endl;
int n;
cin>>n;
char*str=new char[n+1];
cout<<"输入字符"<<endl;
for(int i=1;i<=n;i++){
cin>>str[i];//题目要求的是a b c等字母
}
CreateHuffmanTree(HT,n);
CreatHuffmanCode(HT,HC,n);
cout<<"输入字符的权值"<<endl;
for(int i=1;i<=n;i++)
{
cout<<str[i]<<"的Huffman编码为: "<<HC[i]<<endl;
}
return 0;
}
本文引用部分https://blog.csdn.net/qq_44218805/article/details/103401899的内容
运行结果