- 运行结果
- 代码
#include <iostream>
#include <algorithm>
using namespace std;
#define MAXLEAF 30
#define MAXWEIGHT 1
struct HuffmanNode
{
char node;
double weight;
int parent;
int lchild;
int rchild;
int no;
};
struct HuffmanCode
{
int bit[MAXLEAF];
int length;
};
bool cmp1(HuffmanNode a,HuffmanNode b)
{
return a.weight < b.weight;
}
bool cmp2(HuffmanNode a,HuffmanNode b)
{
return a.no < b.no;
}
HuffmanNode HNode[2*MAXLEAF-1];
HuffmanCode HCode[MAXLEAF];
void InputNode(int n)
{
for(int i=0;i<2*n-1;i++)
{
HNode[i].weight = MAXWEIGHT;
HNode[i].parent = -1;
HNode[i].lchild = -1;
HNode[i].rchild = -1;
HNode[i].no = 2*n;
}
for(int i=0;i<n;i++)
{
cout << "Please input value and weight of leaf node" << i+1 << ": ";
cin >> HNode[i].node >> HNode[i].weight;
HNode[i].no = i;
}
for(int i=0;i<n-1;i++)
{
int min1=0,min2=1;
sort(HNode,HNode+n+i,cmp1);
for(int j=0;j<n+i;j++)
{
if(HNode[min1].parent!=-1)
{
min1++;
min2 = min1+1;
continue;
}
if(HNode[min2].parent!=-1)
min2++;
}
HNode[n+i].lchild = HNode[min1].no;
HNode[n+i].rchild = HNode[min2].no;
HNode[n+i].weight = HNode[min1].weight+HNode[min2].weight;
HNode[n+i].no = n+i;
HNode[min1].parent = HNode[n+i].no;
HNode[min2].parent = HNode[n+i].no;
}
}
void Encode(int n)
{
int offset = 2*n-1,p,j;
HuffmanCode hc;
sort(HNode,HNode+offset,cmp2);
for(int i=0;i<n;i++)
{
hc.length = 0;
j = i;
p = HNode[j].parent;
while(p != -1)
{
if(HNode[p].lchild == HNode[j].no)
hc.bit[hc.length] = 0;
else
hc.bit[hc.length] = 1;
hc.length++;
j = HNode[p].no;
p = HNode[j].parent;
}
for(int k=0;k<hc.length;k++)
HCode[i].bit[k] = hc.bit[hc.length-k-1];
HCode[i].length = hc.length;
}
}
int main()
{
int n;
cout << "Please input n:";
cin >> n;
InputNode(n);
Encode(n);
for(int i=0;i<n;i++)
{
cout << HNode[i].node << ": Huffman code is: ";
for(int j=0;j<HCode[i].length;j++)
cout << HCode[i].bit[j];
cout << endl;
}
return 0;
}