給定字符及其權重(頻率),構建最優前綴編碼樹。算法:
編碼規則:左邊 0,右邊 1(或相反)。中序遍歷輸出編碼。
優先隊列存儲節點指針,需重載比較運算符使最小權重在隊首。
struct Node {
int freq; char ch;
Node *left, *right;
Node(int f, char c) : freq(f), ch(c), left(nullptr), right(nullptr) {}
};
struct Compare {
bool operator()(Node* a, Node* b) { return a->freq > b->freq; } // 最小堆
};
Node* buildHuffman(priority_queue, Compare>& pq) {
while (pq.size() > 1) {
Node *l = pq.top(); pq.pop();
Node *r = pq.top(); pq.pop();
Node *parent = new Node(l->freq + r->freq, 0);
parent->left = l; parent->right = r;
pq.push(parent);
}
return pq.top();
}
void inorder(Node* root, string code) {
if (!root) return;
if (root->left) inorder(root->left, code + '0');
if (!root->left && !root->right) cout << root->ch << ": " << code << endl;
if (root->right) inorder(root->right, code + '1');
}
輸入字符 a-f 及頻率 45,13,12,16,9,5,輸出編碼:a:0, b:101, c:100, d:111, e:1101, f:1100(可能因合併順序不同但等效)。