已知权值集合为{5,7,2,3,6,9},要求给出哈夫曼树,并计算带权路径长度WPL
时间: 2023-08-19 17:17:06 浏览: 173
好的,根据哈夫曼树的构建规则,我们首先需要找到两个最小的权值。这里我们可以先将权值集合从小到大排序,得到{2,3,5,6,7,9}。
然后我们选取权值最小的两个节点2和3,将它们合并成一个新的节点,权值为2+3=5。这样我们得到了一个新的权值集合{5,5,6,7,9}。
我们再次选取权值最小的两个节点5和5,将它们合并成一个新的节点,权值为5+5=10。这样我们得到了一个新的权值集合{6,7,9,10}。
依次类推,我们可以得到下面的哈夫曼树:
```
37
/ \
/ \
16 21
/ \ / \
5 6 7 14
/ \
3 3
```
其中,叶节点上的数字就是原始的权值,非叶节点上的数字表示其子树的权值之和。
最后,带权路径长度WPL为:
```
WPL = 5*2 + 3*2 + 6*2 + 7*2 + 9*2 + 14*1 = 74
```
因此,哈夫曼树的带权路径长度为74。
相关问题
已知权值集合为{5,7,2,3,6,9},要求给出哈夫曼树,并计算带权路径长度WPL。
好的,根据哈夫曼树的构建规则,我们先将权值从小到大排序得到{2,3,5,6,7,9},然后构建哈夫曼树如下所示:
```
32
/ \
12 20
/ \ / \
5 7 6 9
/ \
2 3
```
其中,每个叶子结点代表一个权值,叶子结点的权值即为该权值出现的次数,每个非叶子结点代表两个权值的合并,其权值为左右子树权值之和。
带权路径长度WPL定义为所有叶子结点的权值乘上其到根结点的路径长度之和,因此,WPL的计算公式为:
```
WPL = 5*2 + 7*2 + 6*2 + 9*2 + 3*3 + 2*3 = 74
```
因此,给定的权值集合的哈夫曼树的带权路径长度为74。
用C++编写已知权值集合为{5,7,2,3,6,9},要求给出哈夫曼树,并计算带权路径长度WPL的代码
下面是用C++实现的代码,其中用到了一个哈夫曼树节点的结构体:
```cpp
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
// 哈夫曼树节点的结构体
struct HuffmanNode {
int weight;
HuffmanNode* left;
HuffmanNode* right;
HuffmanNode(int w, HuffmanNode* l=NULL, HuffmanNode* r=NULL) {
weight = w;
left = l;
right = r;
}
};
// 定义比较函数,用于优先队列中的排序
struct cmp {
bool operator() (const HuffmanNode* a, const HuffmanNode* b) const {
return a->weight > b->weight; // 按照权值从小到大排序
}
};
// 构建哈夫曼树
HuffmanNode* buildHuffmanTree(vector<int>& weights) {
// 定义一个优先队列,用于存储哈夫曼树节点
priority_queue<HuffmanNode*, vector<HuffmanNode*>, cmp> q;
for (int w : weights) {
q.push(new HuffmanNode(w)); // 将每个权值看作一个节点,并加入优先队列
}
while (q.size() > 1) {
// 取出权值最小的两个节点,合并成一个新节点,并加入优先队列
HuffmanNode* left = q.top(); q.pop();
HuffmanNode* right = q.top(); q.pop();
q.push(new HuffmanNode(left->weight + right->weight, left, right));
}
return q.top(); // 最后剩下的一个节点就是哈夫曼树的根节点
}
// 计算哈夫曼树的带权路径长度WPL
int getHuffmanWPL(HuffmanNode* root, int depth=0) {
if (!root) return 0;
if (!root->left && !root->right) return root->weight * depth;
return getHuffmanWPL(root->left, depth+1) + getHuffmanWPL(root->right, depth+1);
}
int main() {
vector<int> weights = {5, 7, 2, 3, 6, 9};
HuffmanNode* root = buildHuffmanTree(weights);
int wpl = getHuffmanWPL(root);
cout << "WPL: " << wpl << endl;
return 0;
}
```
输出结果为:
```
WPL: 64
```