|
发表于 2022-7-4 12:37:58
|
显示全部楼层
我把我的哈夫曼编码建树的代码放下面你看一下大概就可以理解了~
typedef struct
{ char ch;
int weight;
int parent,lchild,rchild;
}HTNode,*HuffmanTree;
void CreatHuffmanTree(HuffmanTree & HT, int n)
{
HT = (HuffmanTree)malloc(sizeof(HTNode) * (2*n+2));
for (int i = 1; i <= n; i++)
{
cin >> (HT + i)->ch >> (HT + i)->weight;
(HT + i)->parent = 0;
}
int i, j = 0, m1, n1, p;
HuffmanTree s1=NULL, s2=NULL, P=NULL;
while (j < n - 1)
{
int x = 0;
for (i = 1; i <= n + j; i++)
{
if ((HT+i)->parent == 0)
{
if (x == 1)
{
s2 = (HT+i);
n1 = i;
break;
}
if (x == 0)
{
s1 = (HT + i),
x++;
m1 = i;
}
}
}
if (s2->weight < s1->weight)
{
P = s2, p = n1;
s2 = s1, n1 = m1;
s1 = P, m1 = p;
}
i++;
for (i; i <= n + j; i++)
{
if (HT[i].parent == 0)
{
if (HT[i].weight < s2->weight)
s2 = (HT + i), n1 = i;
if (s2->weight < s1->weight)
{
P = s2, p = n1;
s2 = s1, n1 = m1;
s1 = P, m1 = p;
}
}
}
HT[n + j+1].weight = HT[m1].weight + HT[n1].weight;
HT[n + j+1].lchild = m1;
HT[n + j+1].rchild = n1;
HT[n + j+1].parent = 0;
HT[m1].parent = HT[n1].parent = n + j+1;
j++;
}
} |
|