创建哈夫曼树,并实现对其编码,包括以下功能,1.输入要创建的哈夫曼树的结点数和各结点的权值。2.创建哈夫曼树,根据输入的结点数和各结点的权值创建哈夫曼树,3.输出哈夫曼树。4.对哈夫曼树进行编码,并输出其哈夫曼编码。C++代码
时间: 2024-05-06 13:16:23 浏览: 138
哈夫曼树和哈夫曼编码的实现
以下是C++代码实现:
```cpp
#include <iostream>
#include <queue>
#include <vector>
#include <string>
using namespace std;
// 哈夫曼树节点
struct Node {
int weight; // 权值
char ch; // 叶子节点对应的字符
Node* left; // 左子树
Node* right; // 右子树
Node(int w = 0, char c = '\0', Node* l = nullptr, Node* r = nullptr) :
weight(w), ch(c), left(l), right(r) {}
};
// 比较两个节点的权值大小
struct CompareNode {
bool operator()(Node* a, Node* b) const {
return a->weight > b->weight;
}
};
// 创建哈夫曼树
Node* createHuffmanTree(int n, int* weights) {
// 创建小根堆
priority_queue<Node*, vector<Node*>, CompareNode> heap;
for (int i = 0; i < n; ++i) {
heap.push(new Node(weights[i]));
}
// 构建哈夫曼树
while (heap.size() > 1) {
Node* left = heap.top();
heap.pop();
Node* right = heap.top();
heap.pop();
Node* parent = new Node(left->weight + right->weight, '\0', left, right);
heap.push(parent);
}
return heap.top();
}
// 输出哈夫曼树
void printHuffmanTree(Node* root, string code = "") {
if (!root) {
return;
}
if (root->ch) {
cout << root->ch << ": " << code << endl;
}
else {
printHuffmanTree(root->left, code + "0");
printHuffmanTree(root->right, code + "1");
}
}
// 对哈夫曼树进行编码
void encodeHuffmanTree(Node* root, string& code, char ch) {
if (!root) {
return;
}
if (root->ch == ch) {
return;
}
else if (root->left && root->left->ch != ch) {
encodeHuffmanTree(root->left, code, ch);
code += "0";
}
else if (root->right && root->right->ch != ch) {
encodeHuffmanTree(root->right, code, ch);
code += "1";
}
}
int main() {
int n;
cout << "请输入哈夫曼树的结点数:";
cin >> n;
int* weights = new int[n];
for (int i = 0; i < n; ++i) {
cout << "请输入第" << i + 1 << "个结点的权值:";
cin >> weights[i];
}
Node* root = createHuffmanTree(n, weights);
cout << "哈夫曼树:" << endl;
printHuffmanTree(root);
string code;
char ch;
cout << "请输入要编码的字符:";
cin >> ch;
encodeHuffmanTree(root, code, ch);
cout << "编码结果:" << code << endl;
delete[] weights;
delete root;
return 0;
}
```
代码中使用了 STL 中的 `priority_queue` 来实现小根堆,方便了哈夫曼树的构建。其中 `CompareNode` 结构体重载了 `<` 运算符,用于比较两个节点的权值大小。函数 `createHuffmanTree` 用于创建哈夫曼树,函数 `printHuffmanTree` 用于输出哈夫曼树,函数 `encodeHuffmanTree` 用于对哈夫曼树进行编码。最后记得释放动态分配的节点和权值数组。
阅读全文