1.输入要创建的哈夫曼树的结点数和各结点的权权值。 2.建立哈夫曼树:根据输入的结点数和各结点的权值建哈夫曼树。 3.输出哈夫曼树。 4.对哈夫曼树进行编码,并输出其哈夫曼编码。 用c++写这个代码
时间: 2024-05-16 18:17:10 浏览: 96
哈夫曼树构造算法如下-树和二叉树
```c++
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<string>
using namespace std;
// 结点类
class TreeNode {
public:
int weight; // 权值
char ch; // 字符
TreeNode* left; // 左子结点
TreeNode* right; // 右子结点
TreeNode(int w, char c) : weight(w), ch(c), left(NULL), right(NULL) {}
};
// 结点比较器
class cmp {
public:
bool operator()(TreeNode* a, TreeNode* b) {
return a->weight > b->weight; // 优先级队列中小根堆的比较方式
}
};
// 哈夫曼树类
class HuffmanTree {
public:
TreeNode* root; // 根结点
HuffmanTree() : root(NULL) {}
// 建立哈夫曼树
void createHuffmanTree(vector<int>& weights, vector<char>& chars) {
priority_queue<TreeNode*, vector<TreeNode*>, cmp> pq; // 优先级队列,小根堆
int n = weights.size();
for (int i = 0; i < n; i++) {
TreeNode* node = new TreeNode(weights[i], chars[i]); // 创建结点
pq.push(node); // 将结点加入优先级队列
}
while (pq.size() > 1) { // 当队列中结点个数大于1时,继续合并
TreeNode* left = pq.top(); // 取出权值最小的两个结点
pq.pop();
TreeNode* right = pq.top();
pq.pop();
TreeNode* parent = new TreeNode(left->weight + right->weight, '\0'); // 创建一个新的父结点
parent->left = left; // 将左右子结点加入到父结点中
parent->right = right;
pq.push(parent); // 将新创建的父结点加入到优先级队列中
}
root = pq.top(); // 最后队列中剩下的结点就是哈夫曼树的根结点
}
// 前序遍历哈夫曼树
void preorder(TreeNode* node) {
if (node == NULL) return;
cout << node->weight << " ";
if (node->ch != '\0') {
cout << node->ch << " ";
}
preorder(node->left);
preorder(node->right);
}
// 哈夫曼编码
void getCode(TreeNode* node, string code, vector<string>& codes) {
if (node == NULL) return;
if (node->ch != '\0') {
codes[node->ch] = code;
}
getCode(node->left, code + "0", codes); // 左子结点编码为0
getCode(node->right, code + "1", codes); // 右子结点编码为1
}
};
int main() {
int n; // 结点个数
vector<int> weights; // 权值
vector<char> chars; // 字符
cout << "请输入结点个数:";
cin >> n;
cout << "请输入各结点的权值和字符,如 5 a 表示一个权值为5,字符为a的结点:" << endl;
for (int i = 0; i < n; i++) {
int w;
char c;
cin >> w >> c;
weights.push_back(w);
chars.push_back(c);
}
HuffmanTree tree;
tree.createHuffmanTree(weights, chars);
cout << "哈夫曼树前序遍历结果为:" << endl;
tree.preorder(tree.root);
vector<string> codes(256); // 存储256个ASCII码的哈夫曼编码
tree.getCode(tree.root, "", codes);
cout << endl << "各字符的哈夫曼编码为:" << endl;
for (int i = 0; i < 256; i++) {
if (codes[i] != "") {
cout << char(i) << ":" << codes[i] << endl;
}
}
return 0;
}
```
阅读全文