哈夫曼樹的建立 編碼及解碼的詳解和實現

2021-10-12 01:20:53 字數 3874 閱讀 3281

二叉樹的帶權路徑長度

二叉樹中所有葉子結點的帶權路徑長度之和

根到結點的路徑長度

從根到結點的路徑上的分支數

哈夫曼樹二叉樹

又稱最優二叉樹,是一帶權路徑長度最短的二叉樹。

例:設結點a、b、c、d的權值分別為1、3、5、7,

二叉樹(1)的帶權路徑長度=31+33+25+17=29

二叉樹(2)的帶權路徑長度=21+23+25+27=32

二叉樹(3)的帶權路徑長度=21+33+35+17=33

在所有可以構建的二叉樹中,(1)的帶權路徑長度是最短,所以(1)是最優二叉樹。

所以,那麼問題來了。

怎麼構建哈夫曼樹呢?

根據給定的n個權值構成n棵二叉樹的集合f=,其中每棵二叉樹只含乙個帶權的根結點,其左右子樹均空

在f中選兩棵根結點的權值最小的二叉樹作為左右子樹,構造一棵新的二叉樹,且置新的二叉樹的根結點的權值為其左、右子樹上根結點的權值之和

在f中刪除這兩棵二叉樹,同時將新得到的二叉樹加入f ;

重複2和3,直到f只含一棵二叉樹,此即最優二叉樹

**如下:

//ht為哈夫曼樹,min為一結構體的命名。

for(

int i = num +

1; i <= m; i++

)

輸入一串字元,將他們用哈夫曼碼的形式輸出。

string estring;

//建立乙個字串型別的資料,用於儲存哈夫曼碼

for(

int i =

0;i <= s.

size()

; i++)}

}

選中要編譯字串中的乙個字元

選中的字元哈夫曼樹中的每個字元進行對比;

若兩字元相等,則將哈夫曼中字元的哈夫曼碼連線至estring(要輸出的字串)後。

待要編譯的字串全部編譯完成,則輸出estring

輸入一串哈夫曼碼,將其解碼變成一串字元。

string estring;

//建立乙個字串型別的資料,用於儲存解碼得出的字元

int pos =

0, first =0;

for(

int x =

0; x <= s.

size()

; x++)}

}

輸入一串哈夫曼碼

將first指向第乙個字元,代表從這個字元開始,pos賦值為1(代表選取乙個字元),將選取得到的字元與哈夫曼樹中的每個哈夫曼碼進行對比

如果兩字元相等,將此哈夫曼碼相對應的字元直接輸出,first 指向pos+first字元處,pos變為1;若不相等pos+1,接著進行比較。

直到解碼結束。

#include

#include

#include

using

namespace std;

//哈夫曼樹的儲存結構

typedef

struct

htnode,

*huffmantree;

//兩個最小結點

typedef

struct

min;

//選擇結點權值最小的兩個結點

min select

(huffmantree ht,

int n)

}for

(int i =

1; i <= n; i++)}

code.s1 = s1;

code.s2 = s2;

return code;

}//將哈夫曼碼儲存在結構體num中

void

putlorinnum

(huffmantree &hft,

int num)}}

//創造哈夫曼樹

void

createhuffmantree

(huffmantree &ht,

int num)

cout <<

"請輸入每個資料及其權值:"

<< endl;

for(

int i =

1; i <= num; i++

)for

(int i = num +

1; i <= m; i++

)//構建哈夫曼樹

putlorinnum

(ht, m)

;for

(int i =

1; i <= m; i++

)//進行每個字元哈夫曼碼的輸出}}

//將一串字元編譯成哈夫曼碼

void

changchartohft

(huffmantree hft, string s,

int m)}}

cout<

return;}

//將一串哈夫曼碼解譯成一串字元

void

changhfttochar

(huffmantree hft, string s,

int m)}}

cout<

}int

main()

else

if(q==2)

else

break;}

return0;

}

此程式在code::blocks上可成功執行。

輸入輸出形式如上圖。

c 哈夫曼樹的建立 編碼 解碼

哈夫曼樹的建立和編碼 include includeusing namespace std typedef struct hthtnode,huffmantree typedef char huffmancode void select huffmantree ht,int k,int s1,int...

哈夫曼樹樹生成及編碼解碼

哈夫曼編碼 time limit 1000 2000 ms c others memory limit 32768 32768 k c others problem description 由若干個值無重複的結點及其權值,建立相應的哈夫曼樹。在合併過程中,若出現權值相同的情況,則優先選取編號小的進行...

哈夫曼樹及哈夫曼編碼

哈夫曼樹,最優二叉樹,帶權路徑長度 wpl 最短的樹。它沒有度為1的點,是一棵嚴格的二叉樹 滿二叉樹 了解哈夫曼樹,我們首先要知道樹的幾個相關術語,並了解什麼是wpl。注 樹的wpl這個概念非常重要,這個公式直接產生了哈夫曼編碼資料壓縮的應用 根據給定的n個權值構成n棵二叉樹的集合f 其中每棵二叉樹...