用 c++创建哈夫曼树,并实现对其编码,包括以下功能: 1.输入要创建的哈夫曼树的结点数和各结点的权权值。 2.建立哈夫曼树:根据输入的结点数和各结点的权值建哈夫曼树。 3.输出哈夫曼树。 4.对哈夫曼树进行编码,并输出其哈夫曼编码。
时间: 2024-03-29 17:11:29 浏览: 60
以下是用 C++ 实现哈夫曼树及编码的示例代码:
```c++
#include <iostream>
#include <queue>
#include <unordered_map>
using namespace std;
struct Node {
char data;
int freq;
Node* left;
Node* right;
Node(char data, int freq) {
this->data = data;
this->freq = freq;
left = NULL;
right = NULL;
}
};
struct Compare {
bool operator()(Node* l, Node* r) {
return l->freq > r->freq;
}
};
void encode(Node* root, string str, unordered_map<char, string>& huffmanCode) {
if (root == NULL) {
return;
}
if (!root->left && !root->right) {
huffmanCode[root->data] = str;
}
encode(root->left, str + "0", huffmanCode);
encode(root->right, str + "1", huffmanCode);
}
void decode(Node* root, int& index, string str) {
if (root == NULL) {
return;
}
if (!root->left && !root->right) {
cout << root->data;
return;
}
index++;
if (str[index] == '0') {
decode(root->left, index, str);
} else {
decode(root->right, index, str);
}
}
void buildHuffmanTree(string text) {
unordered_map<char, int> freqMap;
for (char c : text) {
freqMap[c]++;
}
priority_queue<Node*, vector<Node*>, Compare> pq;
for (auto pair : freqMap) {
pq.push(new Node(pair.first, pair.second));
}
while (pq.size() > 1) {
Node* left = pq.top();
pq.pop();
Node* right = pq.top();
pq.pop();
Node* node = new Node('\0', left->freq + right->freq);
node->left = left;
node->right = right;
pq.push(node);
}
Node* root = pq.top();
unordered_map<char, string> huffmanCode;
encode(root, "", huffmanCode);
cout << "Huffman Code:\n";
for (auto pair : huffmanCode) {
cout << pair.first << ": " << pair.second << "\n";
}
string encodedText = "";
for (char c : text) {
encodedText += huffmanCode[c];
}
cout << "Encoded Text: " << encodedText << "\n";
int index = -1;
cout << "Decoded Text: ";
while (index < (int)encodedText.size() - 2) {
decode(root, index, encodedText);
}
cout << "\n";
}
int main() {
string text = "Hello, World!";
buildHuffmanTree(text);
return 0;
}
```
在这个示例代码中,我们首先将输入的文本中每个字符的出现频率存储在一个 unordered_map 中。然后,我们使用一个优先队列(min-heap)来不断地取出频率最小的两个结点,将它们合并成一个新的结点,并将其加入队列中,直到队列中只剩下一个结点,即哈夫曼树的根节点。
接下来,我们使用递归的方式来对哈夫曼树进行编码,同时将每个字符的编码存储在一个 unordered_map 中。对于解码过程,我们从根节点开始遍历哈夫曼树,如果遇到叶子节点,则输出该节点对应的字符,并将索引变量 index 加 1。如果遇到 0,则递归遍历左子树;如果遇到 1,则递归遍历右子树。
最后,我们将原始文本中的每个字符编码成它对应的哈夫曼编码,并输出编码结果。同时,我们还将编码结果解码并输出原始文本。
阅读全文