1. 程式人生 > 其它 >C++實現Huffman樹

C++實現Huffman樹

程式碼如下:

#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; }

測試結果:
在這裡插入圖片描述