資料結構之赫夫曼樹

2021-10-10 09:26:21 字數 2187 閱讀 1876

每個結點應該包含的資訊有:字元內容、父結點和左右孩子結點的下標、權重以及該字元的編碼。

struct hfnode};

class

huffmantree

void

selectmin

(int len,

int&s1,

int&s2)

else

if(ht[i]

.weight < min2)}}

}void

createhftree()

for(i =

1; i <= leafnum;

++i)

for(i = leafnum +

1; i <

2* leafnum;

++i)

}void

huffmancoding()

else

}for

(j = code.

length()

-1; j >=0;

--j)}}

void

huffmandecoding

(string str)

else

if(ch ==

'1')

else

if(ht[c]

.lchild ==

0&& ht[c]

.rchild ==0)

else}if

(ch ==

'\0'

)else

}void

transfertocode

(string str)}}

};

(1) 計算帶權路徑和(apl)
如下圖中,葉子都用大寫字母表示,權值對應為:a-7,b-6,c-2,d-3

樹的帶權路徑和 = 7*1 + 6*2 + 2*3 + 3*3 = 34

//全域性變數

//這裡的count是路徑數,初始傳入0

void

findapl

(binode* t,

int count)

findapl

(t->lchild, count +1)

;findapl

(t->rchild, count +1);}}

(2) 求二叉樹最大路徑

如下圖所示,共有4個葉子即有4條路徑,

路徑1權值=5 + 4 + 11 + 7 = 27

路徑2權值=5 + 4 + 11 + 2 = 22

路徑3權值=5 + 8 + 13 = 26

路徑4權值=5 + 8 + 4 + 1 = 18

可計算出最大路徑權值是27。

該樹輸入的先序遍歷結果為abcd00e000fg00h0i00,各結點權值為:

//全域性變數

struct binode};

void

createbitree

(binode* t)

else

}void

inputweight

(binode* t)

}void

getmax

(binode* t)if(

!t->rchild)

max = max > t-

>weight ? max : t-

>weight;

//取最大路徑

getmax

(t->lchild)

;getmax

(t->rchild);}

}

演算法思路:將一條路徑中所有父結點的權重加到葉子結點上,就是這條路徑的路徑權值。用乙個全域性變數max去比較每次遍歷到的結點的權重,取最大值,最終能找到最大路徑權值。

資料結構 赫夫曼樹

赫夫曼樹 huffman tree 又稱為最優樹,是一類帶權路徑長度最短的樹。本文僅討論最優二叉樹。樹的路徑長度是指從樹根到樹中其餘各個結點的路徑長度之和。對具有n個結點的二叉樹而言,完全二叉樹具有最短的樹的路徑長度。若在二叉樹中,樹葉結點帶有權值,則有 結點的帶權路徑長度定義為從樹根到該結點之間的...

資料結構 赫夫曼樹

赫夫曼編碼是首個試用的編碼方案。屬於無失真壓縮的編碼方案。在資料通訊中,赫夫曼編碼可以根據字元出現頻率,構造出一種不等長的二進位制,使編碼後的電文長度最短,且不產生二義性。weighteed path length是樹中所有節點的帶權路徑長度之和。wpl 值越小,說明構造出來的二叉樹效能越優。赫夫曼...

資料結構(八) 赫夫曼樹

一 基本介紹 1 給定n個權值作為n個葉子節點,構造一顆二叉樹,如果這個樹的帶權路徑長度達到最小,就叫做 最優二叉樹 也叫 赫夫曼樹 帶權路徑最短 最優二叉樹 赫夫曼樹 2 赫夫曼樹是帶權路徑長度最短的樹,權值較大的節點離根很近 二 重要概念 三 赫夫曼樹建立思路 乙個數列,要求轉成一顆赫夫曼樹 1...