#include <iostream>
#include <stdio.h>
using namespace std;
#define MaxWeight 1000 //最大权值
#define MaxBit 1000 //编码最大位数
#define MaxN 1000 //最多结点数
typedef struct
{
int flag; //标记
int weight; //权值
int parent; //父结点
int left; //左结点
int right; //右结点
}HuffmanTreeNode;
typedef struct
{
int bit[MaxBit]; //编码数组
int start; //编码位数
}HuffmanCode;
class Huffman
{
public:
Huffman(HuffmanTreeNode *&,HuffmanCode *&,int n);
void MakeHuffman(int weight[],int n);
void CodeHuffman(int n);
private:
HuffmanTreeNode *huffmantreenode;
HuffmanCode *huffmancode;
};
Huffman::Huffman(HuffmanTreeNode *& ht,HuffmanCode *& hc,int n)
{
ht=new HuffmanTreeNode[2*n-1];
hc=new HuffmanCode[n];
huffmantreenode=ht;
huffmancode=hc;
}
void Huffman::MakeHuffman(int weight[],int n)
{
int i,j,x1,x2,m1,m2; //初始化,m1,m2分别保存最小和次小值
for(i=0;i<2*n-1;++i)
{
if(i<n)
huffmantreenode[i].weight=weight[i];
else
huffmantreenode[i].weight=0;
huffmantreenode[i].flag=0;
huffmantreenode[i].parent=0;
huffmantreenode[i].left=-1;
huffmantreenode[i].right=-1;
}
for(i=0;i<n-1;++i) //n-1次构造步骤
{
m1=m2=MaxWeight;
x1=x2=0;
for(j=0;j<n+i;++j)
{
if(huffmantreenode[j].weight<=m1&&huffmantreenode[j].flag==0) // x<=m1<m2
{
m2=m1;
x2=x1;
m1=huffmantreenode[j].weight;
x1=j;
}
else if(huffmantreenode[j].weight<m2&&huffmantreenode[j].flag==0) //m1<x<m2
{
x2=j;
m2=huffmantreenode[j].weight;
}
}
//开始合并
huffmantreenode[n+i].weight=huffmantreenode[x1].weight+huffmantreenode[x2].weight;
huffmantreenode[x1].flag=1;
huffmantreenode[x2].flag=1;
huffmantreenode[n+i].left=x1;
huffmantreenode[n+i].right=x2;
huffmantreenode[x1].parent=n+i;
huffmantreenode[x2].parent=n+i;
}
}
void Huffman::CodeHuffman(int n)
{
HuffmanCode *hc=new HuffmanCode;
int i,j,child,parent;
for(i=0;i<n;++i)
{
hc->start=n-1; //最大编码数为n-1
child=i;
parent=huffmantreenode[child].parent;
while(parent!=0) //由下往上推
{ if(huffmantreenode[parent].left==child)
hc->bit[hc->start]=0; //左编码为0
else if(huffmantreenode[parent].right==child)
hc->bit[hc->start]=1; //右编码为1
hc->start--;
child=parent;
parent=huffmantreenode[child].parent;
}
for(j=hc->start+1;j<n;j++) //赋值编码
huffmancode[i].bit[j]=hc->bit[j];
huffmancode[i].start=hc->start;
}
}
int main()
{
cout<<"哈夫曼树测试"<<endl;
int i,j,n,weight[MaxN];
printf("Please input weight array\n");
printf("Input the numbers of array\n");
cin>>n;
for(i=0;i<n;++i)
cin>>weight[i];
HuffmanTreeNode *ht;
HuffmanCode *hc;
Huffman myHuffman(ht,hc,n);
myHuffman.MakeHuffman(weight,n);
myHuffman.CodeHuffman(n);
printf("Result of huffmancode\n");
for(i=0;i<n;++i)
{
cout<<"weight="<<ht[i].weight<<" Code=";
for(j=hc[i].start+1;j<n;++j)
cout<<hc[i].bit[j];
cout<<endl;
}
system("pause");
return 0;
}
哈夫曼树
最新推荐文章于 2021-05-20 18:00:47 发布