註解詳細的huffman哈夫曼編碼

2021-10-07 01:58:06 字數 2121 閱讀 2409

題目描述

給定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 每次選擇兩個權值最小的二叉樹做子樹合併為乙個新的二叉樹,新二叉樹的權值為兩個子樹的和。直到森林中只剩一棵樹為止,該樹即為我們所求得的哈夫曼...