資料結構之建哈夫曼樹

2021-09-22 02:17:52 字數 1386 閱讀 6388

給定n(n為偶數)個節點,以及節點上的權值(均為正數),建立這n個節點的哈夫曼樹

字元 a b c d e f g h

頻率 0.05 0.29 0.07 0.08 0.14 0.23 0.03 0.11

給定n個權值作為n個葉子結點,構造一棵二叉樹,若該樹的帶權路徑長度達到最小,稱這樣的二叉樹為最優二叉樹,也稱為哈夫曼樹(huffman tree)。哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。

假設有n個權值,則構造出的哈夫曼樹有n個葉子結點。 n個權值分別設為 w1、w2、…、wn,則哈夫曼樹的構造規則為:

(1) 將w1、w2、…,wn看成是有n 棵樹的森林(每棵樹僅有乙個結點);

(2) 在森林中選出兩個根結點的權值最小的樹合併,作為一棵新樹的左、右子樹,且新樹的根結點權值為其左、右子樹根結點權值之和;

(3)從森林中刪除選取的兩棵樹,並將新樹加入森林;

(4)重複(2)、(3)步,直到森林中只剩一棵樹為止,該樹即為所求得的哈夫曼樹。

話不多說直接上**

#include

#include

#include

typedef

struct it

it;intcmp

(const

void

*p1,

const

void

*p2)

typedef

struct btnode

btnode,

* bitree;

intmain()

m=2*n-1;

while

(n!=m)

else

if(hash[i]

.vis==

0&&flag==1)

if(flag==2)

break;}

strcpy

(hash[n]

.da,l.da)

;strcat

(hash[n]

.da,

"+")

;strcat

(hash[n]

.da,r.da)

; hash[n]

.fr=l.fr+r.fr;

hash[n]

.vis=0;

printf

("%s的頻率是%lf %s的頻率是%lf,一起構成了%s,頻率為%lf\n"

,l.da,l.fr,r.da,r.fr,hash[n]

.da,hash[n]

.fr)

; n++;}

}

輸入比較麻煩一點,必竟是小數,注意一點吧!

此**僅供參考,請勿抄襲!

這裡附上哈夫曼樹的一些講解的部落格!

資料結構之哈夫曼樹

現在,我們經常會使用壓縮和解壓縮軟體來處理文件,因為它除了可以減少文件在磁碟上的空間外,還有重要的一點,就是我們可以在網路上一壓縮的形式傳輸大量資料,是的儲存和傳遞都更加高效。那麼壓縮而不出錯是如何做到的呢?簡單說,就是把我們要壓縮的文字進行重新編碼,今天我們就介紹一種最基本的壓縮編碼方法 哈夫曼編...

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

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

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

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