二叉樹演算法三之哈弗曼樹和編碼

2021-06-21 23:50:37 字數 803 閱讀 1633

這一節介紹哈夫曼樹和哈弗曼編碼,其中構造哈弗曼樹的步驟如下

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

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

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

4. 重複2和3步驟,直到f只含一棵樹為止。這棵樹便是哈弗曼樹。

對於哈弗曼編碼是一種最基本的壓縮編碼方式,就是根據哈弗曼樹,然後字首編碼,左子樹為0,右子樹為1

實現的**是參考感覺**讀起來易懂

我知識調整了下**的結構,讓**更加清晰,還有刪去了源**的解碼函式,但是核心**都沒有變化,其中關於如何求權值可以使用優先佇列,參考九度題目1172:哈夫曼樹

**中用的是實現二叉樹的另外一種儲存結構,雙親表示法,其實感覺這個雙親表示法的思想和靜態鍊錶的思想類似

struct hatree;

struct hacode;

struct hatree h[maxn];

建立哈弗曼樹的**如下:

void creathuffmantree(struct hatree *h,int n);

struct hacode;

struct hatree h[maxn];

void creathuffmantree(struct hatree *h,int n){

int i,j;

int m=2*n-1;

for(i=0;i

基礎知識 二叉樹 廣義表 哈弗曼編碼

二叉樹性質 1.第i層最多有2 i 1 個結點 2.深度為k的二叉樹最多有2 k 1個結點 3.度為0 葉子結點 的結點比度為2的結點多1 4.總結點數 總邊數 1 可用來表示二叉樹.表示形式如下 廣義表建立二叉樹 結構定義 以括號為分割點來區分左右子樹 開始壓棧標誌 是彈出棧標誌 typedef ...

樹和二叉樹 哈夫曼樹和線索二叉樹

最優二叉樹 葉子結點的權值 對葉子結點賦予的乙個有意義的數值量。二叉樹的帶權路徑長度 設二叉樹具有n個帶權值的葉子結點,從根結點到各個葉子結點的路徑長度與相應葉子結點權值的乘積之和。哈夫曼樹 給定一組具有確定權值的葉子結點,帶權路徑長度最小的二叉樹。哈夫曼樹的特點 1 權值越大的葉子結點越靠近根結點...

哈夫曼編碼 二叉樹應用

其中包含兩個案列,乙個是特定的編碼,還有一種是鍵盤輸入自動計算權值以及解碼。案例一分別使用了陣列和鏈式棧實現哈夫曼樹的編碼同時可以計算壓縮率,案例二使用先序遍歷進行編碼計算總碼長 具體 如下 主類 public class testmian double weight hfmtool hfm1 ne...