樹 哈夫曼樹 構建和實現

2021-10-04 07:17:29 字數 1126 閱讀 9851

在乙個果園裡,小明已經將所有的水果打了下來,並按水果的不同種類分成了若干堆,小明決定把所有的水果合成一堆。

每一次合併,小明可以把兩堆水果合併到一起,消耗的體力等於兩堆水果的重量之和。

當然經過 n‐1 次合併之後,就變成一堆了。小明在合併水果時總共消耗的體力等於每次合併所耗體力之和。

假定每個水果重量都為 1,並且已知水果的種類數和每種水果的數目,你的任務是設計出合併的次序方案,使小明耗費的體力最少,並輸出這個最小的體力耗費值。

例如有 3 種水果,數目依次為 1,2,9。可以先將 1,2 堆合併,新堆數目為3,耗費體力為 3。然後將新堆與原先的第三堆合併得到新的堆,耗費體力為 12。所以小明總共耗費體力=3+12=15,可以證明 15 為最小的體力耗費值。

以上就是搬水果問題,引入哈夫曼樹。

樹的帶權路徑長度

weighted path length of tree, wpl

等於它所有葉子結點的帶權路徑長度(葉子權值乘以路徑長度)之和

已知 n 個數,尋找乙個數,使得樹的所有葉子結點的權值恰好為這 n 個數,並且這棵樹的帶圈路徑長度最小。

帶權路徑長度最小的樹被稱為哈夫曼樹,又被稱為最優二叉樹。

顯然,對於同一組葉子結點來說,哈夫曼樹可以是不唯一的,但是最小帶權路徑長度一定是唯一的。

初始狀態下有 n 個結點(結點的權值分別是給定的n個數),將他們視作n棵只有乙個結點的樹

合併其中根結點權值最小的兩棵樹,生成兩棵樹根結點的父節點,權值為這兩個根結點的權值之和,這樣樹的數量就減少了乙個

重複操作 2,直到只剩下一棵樹為止,這棵樹就是哈夫曼樹。

思想:反覆選擇兩個最小的元素,合併,直到只剩下乙個元素。一般可以使用優先佇列(堆)來執行這種策略。

int n;

while

(scanf

("%d"

,&n)

!=eof

)int ans =0;

while

(mypq.

size()

>1)

printf

("%d\n"

, ans)

;}

樹 哈夫曼樹 構建和實現

目錄在乙個果園裡,小明已經將所有的水果打了下來,並按水果的不同種類分成了若干堆,小明決定把所有的水果合成一堆。每一次合併,小明可以把兩堆水果合併到一起,消耗的體力等於兩堆水果的重量之和。當然經過 n 1 次合併之後,就變成一堆了。小明在合併水果時總共消耗的體力等於每次合併所耗體力之和。假定每個水果重...

哈夫曼樹建立和哈夫曼碼生成

直接上 htree.h typedef struct htreenode htreenode main.cpp include include include include htree.h htreenode inithtree int num 初始化哈夫曼樹結點 void getmin htre...

哈夫曼樹的構建

給定n個權值作為n個葉子結點,構造一棵二叉樹,若該樹的帶權路徑長度達到最小,稱這樣的二叉樹為最優二叉樹,也稱為哈夫曼樹 huffman tree 哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。假設有n個權值,則構造出的哈夫曼樹有n個葉子結點。n個權值分別設為 w1 w2 wn,則哈夫曼樹的...