用 c ++写.输入要创建的哈夫曼树的结点数和各结点的权权值。 2.建立哈夫曼树:根据输入的结点数和各结点的权值建哈夫曼树。 3.输出哈夫曼树。 4.对哈夫曼树进行编码,并输出其哈夫曼编码。
时间: 2024-05-15 09:13:54 浏览: 185
以下是用C++语言实现哈夫曼树的代码:
```c++
#include <iostream>
#include <queue>
#include <vector>
#include <string>
using namespace std;
// 哈夫曼树节点
struct TreeNode {
int weight;
TreeNode* left;
TreeNode* right;
TreeNode(int w) : weight(w), left(nullptr), right(nullptr) {}
};
// 按照权值从小到大的顺序比较两个节点
struct CompareNode {
bool operator()(const TreeNode* lhs, const TreeNode* rhs) const {
return lhs->weight > rhs->weight;
}
};
// 构建哈夫曼树
TreeNode* buildHuffmanTree(int n, vector<int>& weights) {
priority_queue<TreeNode*, vector<TreeNode*>, CompareNode> pq;
for (int i = 0; i < n; ++i) {
TreeNode* node = new TreeNode(weights[i]);
pq.push(node);
}
while (pq.size() > 1) {
TreeNode* left = pq.top();
pq.pop();
TreeNode* right = pq.top();
pq.pop();
TreeNode* parent = new TreeNode(left->weight + right->weight);
parent->left = left;
parent->right = right;
pq.push(parent);
}
return pq.top();
}
// 输出哈夫曼树
void printHuffmanTree(TreeNode* root, string code) {
if (root == nullptr) return;
if (!root->left && !root->right) {
cout << "weight: " << root->weight << ", code: " << code << endl;
return;
}
printHuffmanTree(root->left, code + "0");
printHuffmanTree(root->right, code + "1");
}
int main() {
vector<int> weights = { 5, 3, 9, 7, 6, 2 };
int n = weights.size();
TreeNode* root = buildHuffmanTree(n, weights);
printHuffmanTree(root, "");
return 0;
}
```
上面的代码首先定义了一个`TreeNode`结构体,表示哈夫曼树的节点,包括权值和左右子节点。然后定义了一个比较节点的`CompareNode`结构体,用于优先队列中节点的比较。接着实现了`buildHuffmanTree`函数,该函数接收结点数和各结点的权值,使用优先队列构建哈夫曼树,并返回根节点。最后实现了`printHuffmanTree`函数,该函数输出哈夫曼树的每个叶子节点的权值和哈夫曼编码。
在`main`函数中,我们定义了一个包含6个元素的权值向量,然后调用`buildHuffmanTree`函数构建哈夫曼树,最后调用`printHuffmanTree`函数输出每个叶子节点的权值和哈夫曼编码。
阅读全文