給定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...