題目描述
給定n個字元的權值(權值均是大於0的正整數),構造赫夫曼樹ht,並求出這n個字元的赫夫曼編碼hc。
注意:構造赫夫曼樹ht時,在將2棵二叉樹合併成一棵新的二叉樹時,將根結點權值小的用作左子樹!
輸入
先輸入權值的個數n(n>1)。
然後依次輸入n個權值(權值均是大於0的正整數)
輸出
與輸入的n個權值相對應,依次輸出對應的編碼。
編碼時,左孩子分支編碼為0,右孩子分支編碼為1。
樣例輸入
85 29 7 8 14 23 3 11
樣例輸出
0001
101110
1111
11001
0000
001
#include
#include
#include
#include
#pragma warning(disable:4996)
//strcpy有警告
using
namespace std;
typedef
char
** huffmancode;
//動態分配陣列儲存哈夫曼編碼表
//二叉樹的二叉鍊錶儲存表示
typedef
struct
htnode,
* huffmantree;
void
select
(huffmantree ht,
int end,
int* s1,
int* s2)
min1 = ht[i]
.weight;
*s1 = i;
i++;while
(ht[i]
.parent !=
0&& i <= end)
while
(ht[i]
.parent !=
0&& i <= end)
//對找到的兩個結點比較大小,min2為大的,min1為小的
if(ht[i]
.weight < min1)
else
//兩個結點和後續的所有未構建成樹的結點做比較
for(
int j = i +
1; j <= end; j++
)//如果比最小的還小,將min2=min1,min1賦值新的結點的下標
if(ht[j]
.weight < min1)
//如果介於兩者之間,min2賦值為新的結點的位置下標
else
if(ht[j]
.weight >= min1 && ht[j]
.weight < min2)}}
void
createhuffmantree
(huffmantree& ht,
int n)
//構造哈夫曼樹ht
for(i =
1; i <= n;
++i)
//輸人前n個單元中葉子結點的權值
cin >> ht[i]
.weight;
for(i = n +
1; i <= m;
++i)
}void
creathuffmancode
(huffmantree ht, huffmancode& hc,
int n)
//從葉子到根逆向求每個字元的哈夫曼編碼, 儲存在編碼表hc中
//求出第l.個字元的編碼
hc[i]
=new
char
[n - start]
;//為第i個字元編碼分配空間
strcpy
(hc[i]
,&cd[start]);
//將求得的編碼從臨時空間cd複製到hc的當前行中
}//for
delete
cd;
//釋放臨時空間
}int
main()
哈夫曼編碼 Huffman
huffman編碼流程 資料壓縮流程 1 讀取輸入 2 將輸入中的每個char值得出現頻率製成 3 根據頻率構造huffman編碼樹 4 構造編譯表,將輸入中的每個char值和乙個位元字串相關聯 5 將單詞查詢樹編碼為位元字串並寫入輸出流 6 將單詞總數編碼為位元字串並寫入輸出流 7 使用編譯表翻譯...
哈夫曼樹(huffman)
學完了huffman樹,講一下自己對它的理解 圖二public class huffmantree override public int compareto nonnull treenodeo else if this.weight o.weight return 0 傳乙個陣列進來 建立哈夫曼樹...
哈夫曼(Huffman)樹構造和哈夫曼編碼
n個權值,則構造出的哈夫曼樹有 n個葉子結點。n個權值分別設為 w1,w2,wn,則哈夫曼樹的構造規則為 1 根據給定的 n個權值構成n 棵二叉樹的集合 f 2 每次選擇兩個權值最小的二叉樹做子樹合併為乙個新的二叉樹,新二叉樹的權值為兩個子樹的和。直到森林中只剩一棵樹為止,該樹即為我們所求得的哈夫曼...