我需要一个能够构建哈夫曼树并计算带权路径长度的c++代码,用类定义
时间: 2024-03-26 08:41:50 浏览: 70
好的,那我给你提供一个用类定义的C++代码,可以构建哈夫曼树并计算带权路径长度:
```c++
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
class HuffmanTreeNode {
public:
int weight;
HuffmanTreeNode* left;
HuffmanTreeNode* right;
HuffmanTreeNode(int w) : weight(w), left(NULL), right(NULL) {}
};
class HuffmanTree {
private:
HuffmanTreeNode* root;
void destroy(HuffmanTreeNode* node) {
if (node) {
destroy(node->left);
destroy(node->right);
delete node;
}
}
public:
HuffmanTree() : root(NULL) {}
~HuffmanTree() { destroy(root); }
void build(vector<int>& weights) {
priority_queue<int, vector<int>, greater<int>> q;
for (int w : weights) {
q.push(w);
}
while (q.size() > 1) {
int w1 = q.top();
q.pop();
int w2 = q.top();
q.pop();
int w = w1 + w2;
q.push(w);
HuffmanTreeNode* node = new HuffmanTreeNode(w);
node->left = new HuffmanTreeNode(w1);
node->right = new HuffmanTreeNode(w2);
root = node;
}
}
int WPL() {
int wpl = 0;
if (!root) return wpl;
queue<HuffmanTreeNode*> q;
q.push(root);
int level = 0;
while (!q.empty()) {
int size = q.size();
level++;
for (int i = 0; i < size; i++) {
HuffmanTreeNode* node = q.front();
q.pop();
if (!node->left && !node->right) {
wpl += level * node->weight;
}
if (node->left) q.push(node->left);
if (node->right) q.push(node->right);
}
}
return wpl;
}
};
int main() {
int n;
cin >> n;
vector<int> weights(n);
for (int i = 0; i < n; i++) {
cin >> weights[i];
}
HuffmanTree tree;
tree.build(weights);
cout << tree.WPL() << endl;
return 0;
}
```
这个代码定义了两个类:`HuffmanTreeNode`和`HuffmanTree`。其中,`HuffmanTreeNode`表示哈夫曼树的节点,包含一个权值和指向左右子节点的指针。`HuffmanTree`表示哈夫曼树,包含树的根节点和三个方法:`build`用于构建哈夫曼树,`WPL`用于计算带权路径长度,`destroy`用于销毁哈夫曼树。
在`build`方法中,我们使用了一个小根堆(即优先队列)来选取权值最小的两个节点进行合并,然后将合并后的节点插入到树中。由于我们是通过指针连接节点的,所以在最后只剩下一个节点时,我们直接将这个节点赋值给根节点即可。
在`WPL`方法中,我们使用了BFS遍历整棵树,并记录每个叶子节点的深度,然后计算带权路径长度即可。
你可以根据自己的需要进行修改和扩展。
阅读全文