.h文件
#pragma once
#include <iostream>
#include <vector>
#define MAX 1000
//哈夫曼结构
struct HuffmanTree {
float data;
char c;
HuffmanTree* left;
HuffmanTree* right;
int flag; //左0右1
HuffmanTree(float x,char cc) {
data = x;
c = cc;
left = right = NULL;
}
HuffmanTree(float x, HuffmanTree* l, HuffmanTree* r) {
data = x;
left = l;
right = r;
}
};
struct goLeft {
char c;
std::vector<int> v;
};
.cpp文件
#include "pch.h"
#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
#include <string>
#include "HuffmanTree.h"
#include "printTree.h"
using namespace std;
//适配器
struct cmp {
bool operator()(HuffmanTree* &s1, HuffmanTree* &s2) {
return s1->data > s2->data; //升序
}
};
bool compare( goLeft& v1, goLeft& v2) {
return v1.c < v2.c;
}
//创建哈夫曼树
HuffmanTree* createHuffman(float[], char c[],int n,
priority_queue<HuffmanTree*, vector<HuffmanTree*>, cmp>& Q) {
//n个节点 n-1次合并 到最后只有一个根
for (int i = 0; i < n-1; i++) {
//找出两个最小节点
HuffmanTree* h1 = Q.top();
h1->flag = 0;
Q.pop();
HuffmanTree* h2 = Q.top();
h2->flag = 1;
Q.pop();
//合并两个最小节点的值 构造新节点 新节点左小右大链接两个小节点
HuffmanTree* h = new HuffmanTree(h1->data + h2->data,h1,h2);
//重新入堆
Q.push(h);
}
//队列中只有一个节点 哈夫曼树最终的根
return Q.top();
}
vector<int> v;
vector<goLeft> go;
//按序打印叶子节点的编码
void pringGoLeft() {
sort(go.begin(), go.end(), compare);
for (int i = 0; i < go.size(); i++) {
cout << go[i].c << ": ";
for (int j = 0; j < go[i].v.size(); j++)
cout << go[i].v[j];
cout << endl;
}
}
void createPath(HuffmanTree* node) {
if (node->left == NULL && node->right == NULL) {
//不是按序输出
//cout << node->c << ": ";
//for (int i = 0; i < v.size(); i++)
// cout << v[i];
//cout << endl;
goLeft g;
g.c = node->c;
for (int i = 0; i < v.size(); i++)
g.v.push_back(v[i]);
go.push_back(g);
return;
}
v.push_back(node->left->flag);
createPath(node->left);
v.pop_back();
v.push_back(node->right->flag);
createPath(node->right);
v.pop_back();
}
int main()
{
priority_queue<HuffmanTree*, vector<HuffmanTree*>, cmp> Q; //哈夫曼队列
float f[] = { 45,13,12,16,9,5 }; //字符的频率
char c[] = { 'a','b','c','d','e','f' }; //字符
int n = sizeof(f) / sizeof(float);
for (int i = 0; i < n; i++)
Q.push(new HuffmanTree(f[i],c[i]));
HuffmanTree* root = createHuffman(f,c,n,Q);
createPath(root);
pringGoLeft();
return 0;
}
本文详细介绍了一种基于哈夫曼树的编码实现方法,包括结构定义、创建哈夫曼树的过程以及编码路径的生成。通过示例展示了如何使用优先队列进行节点合并,最终得到最优的编码方案。
3362

被折叠的 条评论
为什么被折叠?



