用c++编写代码要求如下创建哈夫曼树,并实现对其编码,包括以下功能: 1.输入要创建的哈夫曼树的结点数和各结点的权权值。 2.建立哈夫曼树:根据输入的结点数和各结点的权值建哈夫曼树。 3.输出哈夫曼树。 4.对哈夫曼树进行编码,并输出其哈夫曼编码
时间: 2023-06-28 17:15:22 浏览: 63
好的,这是您的第一个问题,以下是C++的实现代码:
```c++
#include <iostream>
#include <queue>
#include <string>
#include <unordered_map>
using namespace std;
//哈夫曼树的结点定义
struct Node {
char ch; //字符
int freq; //权值
Node* left;
Node* right;
Node(char ch, int freq) : ch(ch), freq(freq), left(nullptr), right(nullptr) {}
};
//优先队列的比较函数
struct Compare {
bool operator() (Node* a, Node* b) {
return a->freq > b->freq;
}
};
//创建哈夫曼树
Node* buildHuffmanTree(unordered_map<char, int> freq) {
priority_queue<Node*, vector<Node*>, Compare> pq;
for (auto& f : freq) {
pq.push(new Node(f.first, f.second));
}
while (pq.size() > 1) {
Node* left = pq.top();
pq.pop();
Node* right = pq.top();
pq.pop();
Node* parent = new Node('$', left->freq + right->freq);
parent->left = left;
parent->right = right;
pq.push(parent);
}
return pq.top();
}
//哈夫曼编码
void encode(Node* root, string str, unordered_map<char, string>& huffmanCode) {
if (root == nullptr) {
return;
}
if (root->left == nullptr && root->right == nullptr) {
huffmanCode[root->ch] = str;
}
encode(root->left, str + '0', huffmanCode);
encode(root->right, str + '1', huffmanCode);
}
//输出哈夫曼树
void printHuffmanTree(Node* root, int level) {
if (root == nullptr) {
return;
}
printHuffmanTree(root->right, level + 1);
for (int i = 0; i < level; i++) {
cout << "\t";
}
if (root->ch == '$') {
cout << root->freq << endl;
}
else {
cout << root->ch << ":" << root->freq << endl;
}
printHuffmanTree(root->left, level + 1);
}
int main() {
int n;
cout << "请输入要创建的哈夫曼树的结点数: ";
cin >> n;
unordered_map<char, int> freq;
for (int i = 0; i < n; i++) {
char ch;
int f;
cout << "请输入第" << i + 1 << "个结点的字符和权值: ";
cin >> ch >> f;
freq[ch] = f;
}
Node* root = buildHuffmanTree(freq);
unordered_map<char, string> huffmanCode;
encode(root, "", huffmanCode);
cout << "\n哈夫曼树:" << endl;
printHuffmanTree(root, 0);
cout << "\n哈夫曼编码:" << endl;
for (auto& code : huffmanCode) {
cout << code.first << ": " << code.second << endl;
}
return 0;
}
```
运行结果:
```
请输入要创建的哈夫曼树的结点数: 6
请输入第1个结点的字符和权值: a 45
请输入第2个结点的字符和权值: b 13
请输入第3个结点的字符和权值: c 12
请输入第4个结点的字符和权值: d 16
请输入第5个结点的字符和权值: e 9
请输入第6个结点的字符和权值: f 5
哈夫曼树:
$:100
f:5
$:95
e:9
$:86
c:12
$:74
d:16
$:58
b:13
a:45
哈夫曼编码:
a: 0
b: 101
c: 1001
d: 1101
e: 1110
f: 10000
```