C++實現Huffman樹
阿新 • • 發佈:2021-04-03
程式碼如下:
#include <iostream>
using namespace std;
int s1, s2;
typedef struct {
int weight;
int parent, lch, rch;
} HTNode, *HuffmanTree;
void Select(HuffmanTree &HT, int n, int &s1, int &s2) {
int minv;//定義一個臨時變數儲存最小值
for (int i = 1; i <= n; i++) { //開始找第一個最小值
if (HT[i].parent == 0) {
minv = i;
break;
}
}
for (int i = 1; i <= n; i++) {
if (HT[i].parent == 0)
if (HT[i].weight < HT[minv].weight)
minv = i;
}
s1 = minv;
//開始找第二個最小值,且與第一個不同
for (int i = 1; i <= n; i++) {
if (HT[i].parent == 0 && i != s1) {
minv = i;
break;
}
}
for ( int i = 1; i <= n; i++) {
if (HT[i].parent == 0 && i != s1)
if (HT[i].weight < HT[minv].weight)
minv = i;
}
s2 = minv;
}
void CreatHuffmanTree(HuffmanTree HT, int n) {
if (n <= 1)
return ;
int m = 2 * n - 1; //陣列共2n-1個元素
HT = new HTNode[m + 1]; //0號單元未用,HT[m]表示根節點
for ( int i = 1; i <= m; i++) {
HT[i].lch = 0;//初始化
HT[i].rch = 0;
HT[i].parent = 0;
}
for (int i = 1; i <= n; i++) {
cin >> HT[i].weight; //輸入前n個元素的weight值
}
//初始化結束,下面開始建立哈夫曼樹
for (int i = n + 1; i <= m; i++) { //合併產生n-1個結點-構造哈夫曼樹
Select(HT, i - 1, s1, s2); //在HT[k](1<=k<=i-1)中選擇兩個其雙親域為0,
//且權重最小的結點,並返回它們在HT中的序號s1和s2
HT[s1].parent = i;//表示從F中刪除s1,s2
HT[s2].parent = i;
HT[i].lch = s1;//s1,s2分別作為i的左右孩子
HT[i].rch = s2;
HT[i].weight = HT[s1].weight + HT[s2].weight;//i的權重為左右孩子權重之和
cout << HT[i].weight << " " << "(" << HT[s1].weight << "," << HT[s2].weight << ")" << endl;
}
}
int main() {
HuffmanTree H;
int n;
cin >> n;
CreatHuffmanTree(H, n);
return 0;
}
測試結果: