哈夫曼樹又稱最優樹(二叉樹),是一類帶權路徑最短的樹。構造這種樹的演算法最早是由哈夫曼(huffman)2023年提出,這種樹在資訊檢索中很有用。
結點之間的路徑長度:從乙個結點到另乙個結點之間的分支數目。
樹的路徑長度:從樹的根到樹中每乙個結點的路徑長度之和。
結點的帶權路徑長度:從該結點到樹根之間的路徑長度與結點上權的乘積。
樹的帶權路徑長度:樹中所有葉子結點的帶權路徑長度之和,記作:
wpl為最小的二叉樹就稱作最優二叉樹或哈夫曼樹。
完全二叉樹不一定是最優二叉樹。
1.2 哈夫曼樹的構造:
(1)根據給定的n個權值構造n棵二叉樹的集合f=,其中ti中只有乙個權值為wi的根結點,左右子樹7a64e59b9ee7ad9431333236393763為空;
(2)在f中選取兩棵根結點的權值為最小的數作為左、右子樹以構造一棵新的二叉樹,且置新的二叉樹的根結點的權值為左、右子樹上根結點的權值之和。
(3)將新的二叉樹加入到f中,刪除原兩棵根結點權值最小的樹;
(4)重複(2)和(3)直到f中只含一棵樹為止,這棵樹就是哈夫曼樹。
1.3 結點的儲存結構:
構造哈夫曼樹的演算法說明:
#define n /* 葉子總數 /
#define m 2n-1 /* 結點總數 /
證:葉子結點數 n0=n2+1,故哈夫曼樹結點總數為 n0+n2=n0+(n0-1)=2n0-1
例3 在解某些判定問題時,利用哈夫曼樹獲得最佳判定演算法。
(a)wpl=0.051+0.152+0.43+0.34+0.14=3.15
(b)wpl=0.41+0.32+0.153+0.054+0.14=2.05
(c)wpl=0.053+0.153+0.42+0.32+0.1*2=2.2
2. 哈夫曼編碼
從哈夫曼樹根結點開始,對左子樹分配**「0」,右子樹分配**「1」,一直到達葉子結點為止,然後將從樹根沿每條路徑到達葉子結點的**排列起來,便得到了哈夫曼編碼。
例,對電文 emcad 編碼。若等長編碼,則
emcad => 000001010011100 共15位
設各字母的使用頻度為 =。用頻度為權值生成哈夫曼樹,並在葉子上標註對應的字母,樹枝分配**「0」或「1」:
各字母的編碼即為哈夫曼編碼: emcad => 000001011011 共12位
3.二叉排序樹
二叉排序樹是一種特殊結構的二叉樹,它作為一種表的組織手段,通常被稱為樹表。可以作為一種排序和檢索的手段。
定義 二叉排序樹或是空樹,或是具有下述性質的二叉樹:其左子樹上所有結點的資料值均小於根結點的資料值;右子樹上所有結點的資料值均大於或等於根結點的資料值。左子樹和右子樹又各是一棵二叉排序樹。
對二叉排序樹,若按中序遍歷就可以得到由小到大的有序序列。如上圖,中序遍歷得:
3.1 二叉排序樹的生成
對任意一組資料元素序列,要生成一棵二叉排序樹的過程為:
(1)令r1為二叉樹的根;
(2)若r23.2 二叉排序樹中結點的刪除
要求刪除乙個結點後的二叉樹仍是一棵二叉排序樹。演算法思想,分以下幾種情況考慮:
(1)被刪除的結點是葉子結點,則只需修改其雙親結點的指標既可;
(2)被刪除結點p只有左子樹pl或右子樹pr,此時只要使左子樹pl或右子樹pr成為p雙親結點q的左子樹或右子樹即可。
(3)若被刪除結點p的左、右子樹均非空,有兩種做法:
*令pl直接鏈結到q的左(或右)孩子鏈域上,pr鏈結到p結點中序前趨結點s上(s是pl最右下的結點);
*以p結點的直接中序前趨或後繼替代p所指結點,然後再從原二叉排序樹中刪去該直接前趨或後繼。
資料結構 哈夫曼樹 哈夫曼編碼
哈夫曼樹又稱最優樹 二叉樹 是一類帶權路徑最短的樹。構造這種樹的演算法最早是由哈夫曼 huffman 1952年提出,這種樹在資訊檢索中很有用。結點之間的路徑長度 從乙個結點到另乙個結點之間的分支數目。樹的路徑長度 從樹的根到樹中每乙個結點的路徑長度之和。結點的帶權路徑長度 從該結點到樹根之間的路徑...
哈夫曼編碼 哈夫曼樹 (資料結構)
哈夫曼編碼,又稱霍夫曼編碼,是一種編碼方式,哈夫曼編碼是可變字長編碼 vlc 的一種。huffman於1952年提出一種編碼方法,該方法完全依據字元出現概率來構造異字頭的平均長度最短的碼字,有時稱之為最佳編碼,一般就叫做huffman編碼 有時也稱為霍夫曼編碼 include include inc...
哈夫曼樹的應用 哈夫曼編碼
include include include 樹結點定義 typedef struct htnode,huffmantree static char n 100 用於儲存正文 哈弗曼編碼,char型二級指標 typedef char huffmancode 封裝最小權結點和次小權結點 typede...