哈夫曼树具体实现
哈夫曼树的结构体里定义的变量有父节点,左孩子节点,右孩子节点,权重
创建哈夫曼树从下往上先建立孩子节点,然后添加父节点。
添加节点时,要挑选出两个权重最小的节点。
具体操作如下:
#include<iostream>
#include<string>
using namespace std;
#define OK 1
#define ERROR -1
typedef string *HuffmanCode;
typedef struct{
int weight;
int parent, lchild, rchild;
}HTNode,*HuffmanTree;
int Select(HuffmanTree HT, int n, int &s1, int &s2)
{
int m1, m2, i = 0;
m1 = m2 = 32767;
while (i < n)
{
if (HT[i].parent == 0)
{
if (HT[i].weight < m1)
{
m2 = m1;
s2 = s1;
m1 = HT[i].weight;
s1 = i;
}
else if (HT[i].weight < m2)
{
m2 = HT[i].weight;
s2 = i;
}
}
i++;
}
return s1,s2;
}
int HuffmanCoding(HuffmanTree &HT, int *w, int n)
{
if (n <= 1)
return ERROR;
HuffmanTree p;
int i = 0, s1 = 0, s2 = 0;
int m = 2 * n - 1;
HT = (HuffmanTree)malloc((m + 1)*sizeof(HTNode));
for (p = HT; i < n; ++i, ++p)
{
*p = { w[i], 0, 0, 0 };
}
for (; i < m; ++i, ++p)
{
*p = { 0, 0, 0, 0 };
}
for (i = n; i < m; ++i)
{
Select(HT, i, s1, s2);
HT[i].lchild = s1;
HT[i].rchild = s2;
HT[i].weight = HT[s1].weight + HT[s2].weight;
HT[s1].parent = i;
HT[s2].parent = i;
}
for (i = 0; i < n; ++i)
{
int cd[100]; int start;
for (int j = 0; j < 100; j++)
cd[j] = 3;
start = n - 1;
for (int c = i, f = HT[i].parent; f != 0; c = f, f = HT[f].parent)
{
if (HT[f].lchild == c)
cd[--start] = 0;
else
cd[--start] = 1;
}
for (int i = 0; i<n; i++)
{
if (cd[i]!=3)
cout << cd[i] << ' ';
}
cout << endl;
}
return OK;
}
int main()
{
HuffmanTree HT;
int n , w[100];
cout << "你将要输入多少个数据:";
cin >> n;
cout << "输入数据应为int型"<<endl;
for (int i = 0; i < n; i++)
{
cin >> w[i];
}
cout << "字符编码为:" << endl;
HuffmanCoding(HT, w, n);
return 0;
}