1,问题定义
修理牧场
【输入格式】
输入首先给出正整数N(≤104),表示要将木头锯成N块。第二行给出N个正整数(≤50),表示每段木块的长度
【输出格式】
输出1个整数,即将木头锯成N块的最少花费
2.问题分析
先将每个给定权值的结点看成一棵只有根节点的树,然后不断合成权值最小的两个树,生成一个权值为他们之和的一棵新树,最终剩下的一棵树就是哈夫曼树
3.概要设计
(1)哈夫曼树结点结构体
struct HuffmanNode {
int weight; //假定权值为整数
HuffmanNode* left; //定义左子树
HuffmanNode* right; //定义右子树
HuffmanNode(int w) : weight(w), left(NULL), right(NULL) {}
};
(2)比较函数结构体
struct CompareNodes {
bool operator()(const HuffmanNode* a, const HuffmanNode* a2) const //将a和a2定义为常量
{
return a->weight > a2->weight;
}
};
(3)构建哈夫曼树
(4) 创建优先队列,用于存储哈夫曼树节点,按照权值从小到大排序
(5)不断合并权值最小的两棵树,直到只剩下一棵树
(6)取出权值最小的两棵树并计算花费
(7)创建一棵新树,权值为两棵子树权值之和,将新树放入优先队列
(8)释放哈夫曼树节点内存