哈夫曼樹(資料結構)

2021-08-10 20:19:48 字數 1979 閱讀 8352

設二叉樹具有n個帶權值的葉子節點,從根節點到葉子節點的路徑長度與對應葉子節點權值的乘積之和叫做二叉樹的「帶權路徑長度」。

對於一組帶有權值的葉子節點,帶權路徑長度最小的二叉樹叫做「最優二叉樹」(例如哈夫曼樹,哈夫曼樹是最優二叉樹,最優二叉樹不一定是哈夫曼樹)。

如何建立一顆哈夫曼樹?

建立n個根節點,權值為,帶到森林;從森林中選取權值最小的兩顆二叉樹,合併為新的二叉樹,新二叉樹根節點的權值為兩權值之和;將新二叉樹加入森林,被歸併的兩顆二叉樹不再看做是二叉樹;重複選取合併操作,直至森林只有一顆二叉樹,得到的二叉樹就是哈夫曼樹。

哈夫曼樹不一定唯一,但最小帶權路徑長度都相同。

只要權值個數(葉節點個數)嚴格大於1,哈夫曼樹中便不存在度為1的節點,權值個數 (葉節點個數)為n,則哈夫曼樹的節點個數為(2n-1)。

哈夫曼樹對應的編碼為哈夫曼編碼,是一種最優字首編碼。

7.建立哈夫曼樹的思路:

分析:含n個字元則哈夫曼樹有(2n-1)個節點,動態開闢(2n-1)個節點的記憶體,用順序儲存結構儲存。構造樹時,從葉子節點往上走,識別字元或者解碼時從上往下走,故節點要包含雙親,左右孩子下標和權值。

具體思路:

1)動態開闢所有節點的儲存空間,初始化各葉節點和分支節點(已知各葉節點的權值,其他各項初始化為0,具體原因下面分析。)

2)構造哈夫曼樹關鍵是逐步確定各分支節點的相關資訊:求出最小的二叉樹,據此設定當前各分支節點各成員的值。

3)開闢空指標陣列。開闢臨時存放單個編碼的陣列,從葉出發逆向尋根,每向上一步都將當前編碼符記錄到臨時陣列最後乙個空位置,待到達根則臨時陣列中得到臨時編碼,後將該編碼複製到指標陣列的適當位置即可。

構建哈夫曼樹,求哈夫曼編碼**:

typedef

struct

htnode;

typedef htnode *huffmantree;

typedef

char* *huffmancode;//用於存放編碼的陣列

int minn(huffmantree &ht,int k)

//記下最小的權值及其對應於ht的下標

min_weight = ht[i].weight;

min_index = i;

//選出weight最小的元素後,將其parent置為-1,使得下一次比較選取時將其排除在外

ht[i].parent = -1;

return min_weight;

}status select(huffmantree &ht,int k,int &min1,int &min2)

//w為權值陣列,ht為要建立的哈夫曼樹,hc為存放單個編碼的陣列,n為葉子節點個數

status huffmancoding(huffmantree &ht,huffmancode &hc,int *w,int n)

//初始化分支節點,各個資訊賦值為0

for(i = n+1; i <= m; ++i,++p)

//哈夫曼樹共有2n-1個節點,前n個節點是葉子節點,已經有資訊了,剩下的節點從第n+1個開始放

for(i = n+1; i <= m; ++i)

//共有n個節點,每個節點對應乙個字首編碼

hc = (huffmancode*)malloc((n+1)*sizeof(char*));

char * cd = (char*)malloc(sizeof(char)*n);//存編碼的臨時空間,編碼最長為(n-1)

cd[n-1] = '\0';

//逐個葉節點求其編碼(ht中1-n是葉子節點)

for(int i = 1; i <= n; ++i)

//上乙個編碼用了n-start個空間,再分配n-start個空間

hc[i] = (char*)malloc(sizeof(char)*(n-start));

strcpy(hc[i],&cd[start]);

}}

(select函式!!!minn函式!!!構建哈夫曼樹的思路!!!)

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

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

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

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

資料結構 哈夫曼樹

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