编写C++程序,创建哈夫曼树,并实现对其编码,包括以下功能: 1.输入要创建的哈夫曼树的结点数和各结点的权权值。 2.建立哈夫曼树:根据输入的结点数和各结点的权值建哈夫曼树。 3.输出哈夫曼树。 4.对哈夫曼树进行编码,并输出其哈夫曼编码。
时间: 2023-06-29 17:02:20 浏览: 102
哈弗曼树的建立及哈弗曼编码的生成 c++实现
5星 · 资源好评率100%
以下是实现以上功能的C++代码:
```c++
#include <iostream>
#include <queue>
#include <vector>
#include <map>
using namespace std;
// 定义哈夫曼树结点
struct Node {
int value; // 结点权值
Node* left; // 左孩子
Node* right; // 右孩子
Node(int v, Node* l = NULL, Node* r = NULL) : value(v), left(l), right(r) {}
};
// 比较器,用于优先队列中的排序
struct NodeComp {
bool operator() (const Node* n1, const Node* n2) {
return n1->value > n2->value;
}
};
// 建立哈夫曼树
Node* buildHuffmanTree(priority_queue<Node*, vector<Node*>, NodeComp>& q) {
while (q.size() > 1) {
Node* left = q.top();
q.pop();
Node* right = q.top();
q.pop();
Node* parent = new Node(left->value + right->value, left, right);
q.push(parent);
}
return q.top();
}
// 生成哈夫曼编码
void generateHuffmanCode(Node* root, string code, map<int, string>& huffmanCode) {
if (root == NULL) {
return;
}
if (!root->left && !root->right) {
huffmanCode[root->value] = code;
}
generateHuffmanCode(root->left, code + "0", huffmanCode);
generateHuffmanCode(root->right, code + "1", huffmanCode);
}
int main() {
int n;
cout << "请输入要创建的哈夫曼树的结点数:";
cin >> n;
priority_queue<Node*, vector<Node*>, NodeComp> q;
for (int i = 0; i < n; i++) {
int value;
cout << "请输入第" << i + 1 << "个结点的权值:";
cin >> value;
q.push(new Node(value));
}
Node* root = buildHuffmanTree(q);
cout << "哈夫曼树如下:" << endl;
// 层次遍历输出哈夫曼树
queue<Node*> levelQueue;
levelQueue.push(root);
while (!levelQueue.empty()) {
int levelSize = levelQueue.size();
for (int i = 0; i < levelSize; i++) {
Node* currNode = levelQueue.front();
levelQueue.pop();
cout << currNode->value << " ";
if (currNode->left) {
levelQueue.push(currNode->left);
}
if (currNode->right) {
levelQueue.push(currNode->right);
}
}
cout << endl;
}
map<int, string> huffmanCode;
generateHuffmanCode(root, "", huffmanCode);
cout << "哈夫曼编码如下:" << endl;
for (auto it = huffmanCode.begin(); it != huffmanCode.end(); it++) {
cout << it->first << ":" << it->second << endl;
}
return 0;
}
```
运行结果示例:
```
请输入要创建的哈夫曼树的结点数:5
请输入第1个结点的权值:7
请输入第2个结点的权值:5
请输入第3个结点的权值:2
请输入第4个结点的权值:4
请输入第5个结点的权值:3
哈夫曼树如下:
21
2 3 4 5
7
哈夫曼编码如下:
2:000
3:001
4:010
5:011
7:1
```
阅读全文