哈夫曼树是一种**带权路径长度(WPL)**最短的完全二叉树。下面我们使用最小堆来构建哈夫曼树。
/*
最小堆实现哈夫曼树
*/
#include <iostream>
#include <queue>
int A_length = 4;
int A[] = { 1,3,5,8 }; //权值
using namespace std;
//哈夫曼树的数据结构
typedef struct TreeNode* HuffmanTree;
struct TreeNode {
int weight; //权值
HuffmanTree left; //左子树
HuffmanTree right; //右子树
TreeNode() {
}
};
//最小堆
class myComparison {
public:
bool operator()(const HuffmanTree& t1, const HuffmanTree& t2) {
return t1->weight > t2->weight;
}
};
HuffmanTree createTree() {
HuffmanTree huff = new TreeNode;
huff->weight = 0;
huff->left = NULL;
huff->right = NULL;
return huff;
}
//建堆
void buildMinHeap(priority_queue<HuffmanTree, vector<HuffmanTree>, myComparison>& minHeap) {
HuffmanTree huff;
for (int i = 0; i < A_length; i++) {
huff = createTree();
huff->weight = A[i];
minHeap.push(huff);
}
}
//建立哈夫曼树
HuffmanTree huffman(priority_queue<HuffmanTree, vector<HuffmanTree>, myComparison>& minHeap) {
HuffmanTree T;
int size = minHeap.size();
//做size-1次合并
for (int i = 1; i < size; i++) {
T = new TreeNode;
T->left = minHeap.top();
minHeap.pop();
T->right = minHeap.top();
minHeap.pop();
T->weight = T->left->weight + T->right->weight;
minHeap.push(T);
}
T = minHeap.top();
minHeap.pop();
return T;
}
//遍历哈夫曼树
void printTree(HuffmanTree& huff) {
if (huff) {
cout << huff->weight << " ";
printTree(huff->left);
printTree(huff->right);
}
}
int main() {
//建立最小堆
priority_queue<HuffmanTree, vector<HuffmanTree>, myComparison> minHeap;
buildMinHeap(minHeap);
//建立哈夫曼树
HuffmanTree huff;
huff = huffman(minHeap);
//遍历打印哈夫曼树
printTree(huff);
system("pause");
return 0;
}