#H51. Huffman编码

Huffman编码

Description

  详见实验指导书

  TreeNode结构体如下

struct TreeNode {
    char symbol; // 编码的字母
    double freq; // 对应的频率
    TreeNode *left; // 左孩子
    TreeNode *right; // 右孩子
    // 构造函数
    TreeNode()
        : symbol('\0'), freq(0), left(NULL), right(NULL) {}
    // 用symbol和freq构造 TreeNode 对象
    TreeNode(char symbol_, double freq_)
        : symbol(symbol_), freq(freq_), left(NULL), right(NULL) {}
    // () 函数,用于规定优先队列比较运算
    bool operator () (const TreeNode* lhs, const TreeNode* rhs) {
        return lhs->freq > rhs->freq;
    }
};

Format

  不需要也不要进行输入输出。你所提交的代码应具有如下形式。Huffman树可能有多种不同的构造形式,但总代价应相同。只要你的程序构造出总代价最小的Huffman树,即可通过。

#include "Solution.h"

TreeNode* huffman(vector<TreeNode*>& tree) {
    int n = tree.size();
    // 创建一个小顶堆
    priority_queue<TreeNode*, vector<TreeNode*>, TreeNode> q;
    // 把 tree 放入 q 中
    for (int i = 0; i < n; i++) {
        q.push(tree[i]);
    }

    // 请注意,非叶子结点的 symbol 不需要赋值
    // 请在这里完成你的代码

    return q.top();
}

Samples

  你的程序 不需要输入输出,提供一组样例用于自测

algorithm
17 19 20 5 9 34 78 45 12
670