写一个哈夫曼树建立的代码
时间: 2023-12-01 12:51:55 浏览: 68
好的,以下是一个基于C++的哈夫曼树建立代码:
```cpp
#include <iostream>
#include <queue>
#include <vector>
#include <string>
using namespace std;
// 哈夫曼树结点
struct HuffmanNode {
int weight; // 权重
char data; // 数据
HuffmanNode* left; // 左子树
HuffmanNode* right; // 右子树
HuffmanNode(int w = 0, char d = '\0') : weight(w), data(d), left(nullptr), right(nullptr) {}
};
// 哈夫曼树比较函数,用于建立最小堆
struct Compare {
bool operator()(const HuffmanNode* a, const HuffmanNode* b) {
return a->weight > b->weight;
}
};
// 建立哈夫曼树
HuffmanNode* buildHuffmanTree(vector<int>& weights, vector<char>& data) {
priority_queue<HuffmanNode*, vector<HuffmanNode*>, Compare> minHeap; // 最小堆
for (int i = 0; i < weights.size(); i++) {
HuffmanNode* node = new HuffmanNode(weights[i], data[i]);
minHeap.push(node);
}
while (minHeap.size() > 1) {
// 取出最小的两个结点,组成新的树
HuffmanNode* left = minHeap.top();
minHeap.pop();
HuffmanNode* right = minHeap.top();
minHeap.pop();
int weight = left->weight + right->weight;
HuffmanNode* parent = new HuffmanNode(weight, '\0');
parent->left = left;
parent->right = right;
minHeap.push(parent);
}
return minHeap.top(); // 最后堆中仅剩的结点即为哈夫曼树的根节点
}
// 遍历哈夫曼树,获取每个叶节点的编码
void getHuffmanCode(HuffmanNode* root, string& code, vector<string>& codes) {
if (root == nullptr) {
return;
}
if (root->left == nullptr && root->right == nullptr) {
codes[root->data] = code; // 存储编码
}
code.push_back('0');
getHuffmanCode(root->left, code, codes);
code.pop_back();
code.push_back('1');
getHuffmanCode(root->right, code, codes);
code.pop_back();
}
int main() {
vector<int> weights{3, 5, 7, 12, 22};
vector<char> data{'A', 'B', 'C', 'D', 'E'};
HuffmanNode* root = buildHuffmanTree(weights, data); // 建立哈夫曼树
vector<string> codes(256); // 用于存储每个叶节点的编码
string code;
getHuffmanCode(root, code, codes); // 获取哈夫曼编码
for (int i = 0; i < data.size(); i++) {
cout << data[i] << ": " << codes[data[i]] << endl;
}
return 0;
}
```
这段代码会根据输入的权重和数据建立哈夫曼树,并输出每个节点的编码。在建立哈夫曼树时,我们采用了最小堆来选取权重最小的两个结点,不断合并形成新的树,直到最终形成一棵完整的哈夫曼树。而在获取哈夫曼编码时,我们使用了递归的方式遍历哈夫曼树,针对每个叶节点存储其对应的编码。
阅读全文