初始化,从终端读入字符集大小n以及n个字符和n个权值,建立赫夫曼树
时间: 2023-06-20 13:06:08 浏览: 228
好的,这里给出一个基于C++的实现。
```cpp
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
// 节点结构体
struct Node {
char ch; // 字符
int weight; // 权值
Node *left, *right; // 左右子节点
Node(char _ch, int _w) : ch(_ch), weight(_w), left(nullptr), right(nullptr) {}
};
// 比较函数,用于优先队列中的排序
struct cmp {
bool operator()(Node* a, Node* b) { return a->weight > b->weight; }
};
// 建立赫夫曼树
Node* buildHuffmanTree(int n, vector<char>& chars, vector<int>& weights) {
// 创建最小堆,用于存储每个节点
priority_queue<Node*, vector<Node*>, cmp> minHeap;
for (int i = 0; i < n; i++) {
minHeap.push(new Node(chars[i], weights[i]));
}
while (minHeap.size() > 1) {
// 取出权值最小的两个节点
Node* left = minHeap.top();
minHeap.pop();
Node* right = minHeap.top();
minHeap.pop();
// 创建一个新节点,其权值为两个节点的权值之和,左右子节点分别为两个节点
Node* parent = new Node('\0', left->weight + right->weight);
parent->left = left;
parent->right = right;
// 将新节点加入最小堆中
minHeap.push(parent);
}
// 返回根节点
return minHeap.top();
}
int main() {
int n;
cin >> n;
vector<char> chars(n);
vector<int> weights(n);
for (int i = 0; i < n; i++) {
cin >> chars[i] >> weights[i];
}
Node* root = buildHuffmanTree(n, chars, weights);
// TODO: 输出赫夫曼编码等操作
return 0;
}
```
使用示例:
输入:
```
5
A 2
B 3
C 4
D 5
E 6
```
输出:
```
(建立的赫夫曼树结构)
```
需要注意的是,这里只是建立了赫夫曼树的数据结构,还需要进一步实现赫夫曼编码等操作。
阅读全文