(一)问题描述
- 功能要求:通过c++的形式实现哈夫曼树的建立和哈夫曼编码的输出
- 输入输出要求:用cin,cout的方式正确输入输出;
(二)算法结构分析与设计
1.算法中抽象数据类型定义:char**p(二级指针) new创建空间
2.算法主要思路:建立哈夫曼树,然后在这个基础上求叶节点的编码
(三)代码
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
typedef struct HTNode
{
int weight, parent, lchild, rchild;
HTNode(int w, int p, int l, int r) :weight(w), parent(p), lchild(l), rchild(r) {}
} *HuffmanTree;
typedef char** HuffmanCode; //指向字符型数据的指针变量
void Select(HuffmanTree& HT, int n, int& s1, int& s2)
{ //n代表叶节点,s1,s2是权值最小的两个
s1 = 0;
s2 = 0;
int w1=0,w2 = 0;
for (int i = 1;i <= n;i++)
{
if (HT[i].parent == 0)
{
if (s1 == 0)
{
s1 = i;
w1 = HT[i].weight;
continue;
}
if (s2 == 0)
{
s2 = i;
w2 = HT[i].weight;
continue;
}
if (w1 > w2 && w1 > HT[i].weight)
{
w1 = HT[i].weight;
s1 = i;
continue;
}
if (w2 > w1 && w2 > HT[i].weight)
{
w2 = HT[i].weight;
s2 = i;
continue;
}
}
}
}
void HuffmanCoding(HuffmanTree& HT, HuffmanCode& HC, int* w, int n)
{
int m, i;
int s1, s2;
if (n <= 1)
{
return;
}
m = n * 2 - 1;
HT = (HuffmanTree)malloc((static_cast<unsigned long long>(m) + 1) * sizeof(HTNode));
for (i = 1;i <= n;i++, w++) //初始化了叶子节点
{
HT[i] = HTNode(*w, 0, 0, 0);
}
for (;i <= m;i++) //初始化
{
HT[i] = HTNode(0, 0, 0, 0);
}
for (i = n + 1;i <= m;i++)
{
Select(HT, i - 1, s1, s2);
HT[s1].parent = i;
HT[s2].parent = i;
HT[i].lchild = s1;
HT[i].rchild = s2;
HT[i].weight = HT[s1].weight + HT[s2].weight;
}
HC = new char* [n + 1];
char* cd = new char[n];
int temp, count;
for (i = 1;i <= n;i++)
{
count = 0;
for (int c = i, temp = HT[i].parent;temp != 0;c = temp, temp = HT[temp].parent)
{
if (HT[temp].lchild == c)
{
cd[count++] = '0';
}
else
{
cd[count++] = '1';
}
}
cd[count] = '\0';
HC[i] = new char[count];
for (int j = count;j >= 0;j--)
{
HC[i][count - j] = cd[j - 1];
}
}
}
int main()
{
int n;
cout << "叶节点数:";
cin >> n;
char c[100];//叶节点
int b[100];//权重
for (int i = 0;i < n;i++)
{
cin >> c[i] >> b[i];
}
HuffmanTree HT;
HuffmanCode HC;
HuffmanCoding(HT, HC, b, n);
cout << "----------------------------" << endl;
for (int i = 1;i <= n;i++)
{
cout << c[i - 1] << " " << HC[i] << endl;
}
return 0;
}
(四)运行结果