数据结构中c++哈夫曼树的构造代码
时间: 2024-12-02 07:28:40 浏览: 83
哈夫曼树(Huffman Tree),也称为最优二叉树,是一种特殊的二叉树,常用于数据压缩中。它的构建过程通常是通过贪心策略进行的,即每次选择两个权值最小的节点合并成一个新的节点,并赋予这个新节点权值为其两个子节点权值之和,直到所有节点合并成一棵树。
以下是使用C++实现哈夫曼树的一个基本示例,这里我们使用了一个简单的数组来模拟字符及其频率:
```cpp
#include <iostream>
#include <queue>
#include <vector>
// 结构体表示一个带权重的节点
struct Node {
char data;
int freq;
Node* left, *right;
};
// 比较节点按频率升序排列
bool compareNodes(Node* a, Node* b) {
return a->freq < b->freq;
}
// 构建哈夫曼树的函数
Node* buildHuffmanTree(std::vector<int>& freqs, std::string& chars) {
// 创建空队列存放所有节点
std::priority_queue<Node*, std::vector<Node*>, decltype(compareNodes)> pq(compareNodes);
// 将每个字符及其频率作为单独的节点放入队列
for (size_t i = 0; i < freqs.size(); ++i) {
Node* node = new Node();
node->data = chars[i];
node->freq = freqs[i];
node->left = node->right = nullptr;
pq.push(node);
}
while (pq.size() > 1) {
// 取出权值最小的两节点
Node* left = pq.top(); pq.pop();
Node* right = pq.top(); pq.pop();
// 创建新的节点,合并左右子树
Node* newNode = new Node();
newNode->freq = left->freq + right->freq;
newNode->left = left;
newNode->right = right;
// 新节点入队
pq.push(newNode);
}
// 最后的队列只有一个元素就是哈夫曼树的根节点
return pq.top();
}
int main() {
std::vector<int> freqs = {5, 9, 3}; // 字符频率举例
std::string chars = {'A', 'B', 'C'};
Node* huffTree = buildHuffmanTree(freqs, chars);
// 省略绘制哈夫曼树的实际步骤...
return 0;
}
```
阅读全文
相关推荐

















