赫夫曼编码
#include <iostream>
using namespace std;
const int BUFFER_SIZE = 20;
class HuffmanTree
{
public:
HuffmanTree()
{
parent = lchild = rchild = weight = 0;
}
int weight;
int parent, lchild, rchild;
};
void Select(HuffmanTree *pTree, int end, int &s1, int &s2)
{
int min = 65535;
for (int i = 1; i <= end; i++)
{
if ((pTree[i].parent == 0) && (pTree[i].weight < min))
{
s1 = i;
min = pTree[i].weight;
}
}
min = 65535;
for (int i = 1; i <= end; i++)
{
if ((pTree[i].parent == 0) &&
(pTree[i].weight < min) &&
(i != s1))
{
s2 = i;
min = pTree[i].weight;
}
}
}
HuffmanTree* Create(char **HC, int *w, int n)
{
if (n <= 1)
return NULL;
int m = 2 * n - 1;
//0号单元未用
HuffmanTree *pTree = new HuffmanTree[m + 1];
for (int i = 1; i <= n; i++)
{
pTree[i].weight = w[i - 1];
}
for (int i = n + 1; i <= m; ++i)
{
int s1 = 0;
int s2 = 0;
Select(pTree, i - 1, s1, s2);
if (s1 > s2)
swap(s1, s2);
pTree[s1].parent = i;
pTree[s2].parent = i;
pTree[i].lchild = s1;
pTree[i].rchild = s2;
pTree[i].weight = pTree[s1].weight + pTree[s2].weight;
}
cout << "parent lchild rchild weight : \n";
for (int i = 1; i < m + 1; i++ )
{
cout << pTree[i].weight << " ";
cout << pTree[i].parent << " ";
cout << pTree[i].lchild << " ";
cout << pTree[i].rchild << " ";
cout << endl;
}
char HC[20][20];
memset(HC, 0, sizeof(HC));
//*HC = new char[n + 1];
char *pcd = new char[n];
pcd[n - 1] = '\0';
for (int i = 1; i <= n; i++)
{
int start = n - 1;
int c,f;
for (c = i, f = pTree[i].parent; f != 0; c = f, f = pTree[f].parent)
{
if (pTree[f].lchild == c)
pcd[--start] = '0';
else
pcd[--start] = '1';
}
strcpy(HC[i], &pcd[start]);
cout << HC[i] << endl;
}
delete [] pcd;
return pTree;
}