哈夫曼樹及其應用

2021-07-17 03:30:23 字數 2537 閱讀 9214

1、哈夫曼樹的基本概念 

---- 哈夫曼(huffman)樹又稱作最優二叉樹,它是n個帶權葉子結點構成的所有二叉樹中,帶權路徑長度最小的二叉樹。

---- 「路徑」就是從樹中的乙個結點到另乙個結點之間的分支構成的部分,而分支的數目就是路徑長度

----樹的路徑長度:就是從樹根到每一結點的路徑長度之和。

---- 考慮帶權的結點,結點帶權路徑長度為:從該結點到樹根之間的路徑長度與結點上權的乘積。

----帶權路徑長度wpl(weighted path length):樹中所有葉子結點的帶權路徑長度之和。

假設乙個有n個帶權葉子結點的二叉樹,其權值為,每個葉子結點帶權wk,每個葉子的路徑長度為 lk,則從根結點

到各個葉子結點的路徑長度與相應的權值的乘積之和叫做二叉樹的帶權路徑長度,通常記作:

如下圖所示是由4個葉子結點構成的三棵不同的帶權二叉樹:

三棵二叉樹的帶權路徑長度為:

(a)wpl=9x2+4x2+5x2+2x2=18+8+10+4=40

(b)wpl=9x1+5x2+4x3+2x3=9+10+12+6=37

(c)wpl=4x1+2x2+5x3+9x3=4+4+15+27=50

其中(b)所示的二叉樹的wpl最小,此樹是哈夫曼樹。由上圖可知:由n個帶權葉子結點所構成的二叉樹中,滿二叉樹或完全二叉樹

不一定是最優二叉樹。權值越大的結點離根結點越近的二叉樹才是最優二叉樹。

2、哈夫曼樹的構造方法

--1)先把有權值的葉子結點按照從小到大的順序排列成乙個有序序列,即d2,b4,c5,a9.

--2)取頭兩個最小權值的結點作為乙個新結點n的兩個孩子結點,最好相對較小的是左孩子,這裡d為n的左孩子,b為n的右孩子。

如下圖2-1(a)所示,新的結點n的權值為兩個葉子結點權值的和2+4=6.

--3)將n1替換d和b,插入有序序列中,保持從小到大排列。即c5,n6,a9.

--4)重複步驟2),將n與c作為乙個新結點m的兩個孩子結點。如圖2-1(b)所示,m的權值=5+6=11.

--5)將m替換c和n,插入有序序列中,為a9,m11.

--6)重複步驟2),將a和m作為乙個新結點t的兩個孩子結點,由於t是根結點,完成哈夫曼樹的構造。

這樣構造的二叉樹才是最優的哈夫曼樹,通過剛才的步驟,可以得出構造哈夫曼樹的哈夫曼演算法描述:

-- 1)根據給定的n個葉子結點的權值構成n棵二叉樹的集合f=,其中每棵二叉樹ti中只有乙個帶權為wi的

根結點,其左右子樹均為空。

-- 2)在f中選取兩棵根結點的權值最小的樹作為左右子樹

構造一棵新的二叉樹,且置新的二叉樹的根結點的權值為左右子樹上根結點

的權值之和。

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

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

//哈夫曼樹的結點型別

typedef struct htreenode

htnode;

//哈夫曼樹的構造,n個結點,最後生成的樹有2n-1個結點

void createhtree(htnode ht,int n)

for(int j = n;j < 2 * n-1;j++) //前n個結點是已知的葉子結點,構造n之後的結點

,在電文中出現的頻率集合p=

我們以字符集中的字元作為葉子結點、頻率作為權值,構造一棵哈夫曼樹。

其中,每個結點分別對應乙個字元,對t中的邊做標記,把左分支記為「0」,右分支標記為「1」。定義字元的編碼是從根結點到該字元所對

應的葉子結點的路徑上,各條邊上的標記所組成的序列就是哈夫曼編碼。

----a的編碼:0,c的編碼:10,d的編碼:110,b的編碼:111.

顯然對於任意字符集,總能構造出這樣的編碼二叉樹。由於在任何一條從根結點到乙個葉子結點的路徑上一定不會出現其他葉子結點,

所以通過這種方法得到的編碼一定是字首編碼,通過遍歷二叉樹,可以求出每個字元的編碼。

實驗5 樹及其應用 哈夫曼樹

通過本次實驗使學生了解哈夫曼樹的結構特性及其基本操作的實現過程,同時掌握在實際問題背景下的應用開發能力。問題描述 利用哈夫曼編碼進行通訊可以大大提高通道利用率,縮短資訊傳輸時間,降低傳輸成本。但是,這要求在傳送端通過乙個編碼系統對待傳資料預先編碼,在接收端將傳來的資料進行解碼 復原 對於雙工通道 即...

哈夫曼樹的應用 哈夫曼編碼

include include include 樹結點定義 typedef struct htnode,huffmantree static char n 100 用於儲存正文 哈弗曼編碼,char型二級指標 typedef char huffmancode 封裝最小權結點和次小權結點 typede...

哈夫曼樹及其編碼

include include include includeusing namespace std define ok 1 define error 0 define true 1 define false 0 typedef int status 定義哈夫曼樹結點 typedef struct ...