資料結構 10 哈夫曼樹

2021-10-10 20:37:46 字數 1843 閱讀 6247

哈夫曼樹 

路徑:從乙個結點到另乙個結點之間的分支構成這兩個結點之間路徑

樹的路徑長度:從root到每乙個結點的路徑長度之和

結點數碼相同的二叉樹中,完全二叉樹是路徑長度最短的二叉樹

(路徑長度最短的二叉樹不一定是完全二叉樹)

權:給結點賦乙個具有某種含義的值

結點的帶權路徑長度:root到該結點之間的路徑長度 * 權值

wpl樹的帶權路徑長度:樹種所有leaf結點的帶權路徑長度之和

哈夫曼樹:最優樹:wpl最短的樹

具有相同帶權結點的哈夫曼樹不唯一

//貪心演算法?

構造森林全是根

選用兩小造新樹

刪除兩小添新人

重複2、3剩單根

哈夫曼樹中只有度為0、2的結點,沒有度為1的結點

包含n個葉子結點的哈夫曼樹中共有2n-

1個結點

順序儲存結構

typedef

struct

htnode,

*huffmantree;

共有2n-

1個結點,不使用0為下標,2n

void

creathuffmantree

(huffmantree ht,

int n)

for(i =

1; i<=n;

++i) cin>>ht[i]

.weight;

//輸入前n個元素的weight

//接下來通過n-1次合併一次產生n-1個結點ht[i],i=n+1……2n-1

for(i = n+

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

哈夫曼編碼(看書)

任意乙個編碼都不是另乙個字元的編碼的字首 --

-字首編碼

為什麼哈夫曼編碼是字首編碼呢?

因為沒有乙個樹葉是另一片的祖先

為什麼huffman編碼能夠保證字元編碼總長最短

因為huffman樹的帶權路徑長度最短

左分支 0 右分支 1

一看就懂,真的

but,這種方法我們看好看,計算機具體演算法實現較為困難

計算機從葉子往上找較為方便

假設要得到g

從七号結點開始,取7號的parent值8,八號結點是其雙親,

查8號的左右孩子,是左孩子就0、右孩子1,

一直這樣找,找到parent =

0 最後逆序取

有幾個結點就要做多少次

我是沒太懂

void

creathuffmancode

(huffman ht, huffmancode & hc,

int n)

hc[i]

= new char

[n-start]

;//為第i個字串編碼分配空間

strcpy

(hc[i]

,&cd[start]);

//將求得的編碼從臨時空間cd複製到hc的當前行中 }

delete cd;

//釋放臨時空間

}

資料結構 哈夫曼樹 哈夫曼編碼

哈夫曼樹又稱最優樹 二叉樹 是一類帶權路徑最短的樹。構造這種樹的演算法最早是由哈夫曼 huffman 1952年提出,這種樹在資訊檢索中很有用。結點之間的路徑長度 從乙個結點到另乙個結點之間的分支數目。樹的路徑長度 從樹的根到樹中每乙個結點的路徑長度之和。結點的帶權路徑長度 從該結點到樹根之間的路徑...

哈夫曼編碼 哈夫曼樹 (資料結構)

哈夫曼編碼,又稱霍夫曼編碼,是一種編碼方式,哈夫曼編碼是可變字長編碼 vlc 的一種。huffman於1952年提出一種編碼方法,該方法完全依據字元出現概率來構造異字頭的平均長度最短的碼字,有時稱之為最佳編碼,一般就叫做huffman編碼 有時也稱為霍夫曼編碼 include include inc...

資料結構 哈夫曼樹

哈夫曼樹是二叉樹的一種。被稱為最優二叉樹。實際應用中最重要的是帶權路徑長度。樹的路徑長度 樹中每個結點的路徑長度之和。權 附加在樹節點上,表示出現的概率。樹的帶權路徑長度 所有葉子結點帶權長度之和。看例項 的結點路徑長度 從d到 a的路徑,共走了兩條邊,所以為2。樹中的葉子結點有 d,e和 f。結點...