#include<iostream>
#include <queue>
using namespace std;
struct TNode
{
int idx;//在数组里的编号
char c;//字符
long f;//频率
int l, r, p;//左孩子,右孩子,双亲在数组中的下标
TNode():idx(0),c('0'),f(0),l(-1),r(-1),p(-1){}
};
bool operator>(const TNode& x, const TNode& y)
{
return x.f > y.f;
}
priority_queue<TNode, vector<TNode>, greater<TNode>>PQ;
int main()
{
int n;
cout << "请输入字符个数"<<endl;
cin >> n;//字符数,叶子数
int N = 2 * n - 1;//总结点数
TNode* t = new TNode[N];
//初始化叶子结点
cout << "请依次输入字符,及其出现的频率"<<endl;
for (int i = 0; i < n; i++)
{
t[i].idx = i;
cin >> t[i].c;
cin >> t[i].f;
}
//压入优先队列(n个叶子)
for (int i = 0; i < n; i++)
{
PQ.push(t[i]);
}
//产生n-1个内结点,及和子结点、父节点相关联
int k = n;//下一个生成的内结点的idx
for (int j = 1; j <= n - 1; j++)
{
TNode l = PQ.top();
PQ.pop();
TNode r = PQ.top();
PQ.pop();
TNode &p=t[k];
p.idx = k;
p.l = l.idx;
p.r = r.idx;
p.f = l.f + r.f;
PQ.push(p);
t[l.idx].p = k;
t[r.idx].p = k;
k++;
}
//哈夫曼树生成完毕
//打印编码
for (int i = 0; i < n; i++)
{
cout << t[i].c << endl;
vector<int> v;//保存编码
TNode node = t[i];
while (node.p != -1)
{
TNode p = t[node.p];//父节点
if (node.idx == p.l)
{
v.push_back(0);
}
else
{
v.push_back(1);
}
node = p;
}
//输出编码
int k = v.size();
for (int j = k - 1; j >= 0; j--)
{
cout << v[j];
}
cout << endl;
}
//释放内存
delete[] t;
return 0;
}
huffman编码(利用优先队列)
最新推荐文章于 2023-04-16 10:50:25 发布