首先要了解哈夫曼樹的一些概念:
①帶權路徑:每個葉子結點都有權值,對於某葉子結點來說,它的帶權路徑就是「結點權值*從根節點到該結點的路徑長度」。
②哈夫曼樹的構造方法:兩個權值最小的葉子結點作為兄弟去構成乙個非葉節點。(該父親非葉節點的權值=二者之和)
之前我只知道這些基本概念,求帶權路徑和的時候也只是「數數」——數路徑長度,乘上葉子結點權值。但是,其實求帶權路徑和還有更簡單實用的方法!
對於這個哈夫曼樹,可以知道,由於非葉節點之間是具有「包含」關係的,比如29=15+14=7+8+14,58=7+8+14+29,會發現,越往高走,越會重複累加一次下面的葉子結點,其實這就隱含體現了「路徑長度」。
得出結論:哈夫曼樹的帶權路徑和=非葉節點的權值之和。
同時,要記住的是:如何以o(nlogn)的時間複雜度實現哈夫曼樹。
方法:優先佇列模擬「小頂堆」,每次取出堆頂的兩個最小的葉子結點組成乙個非葉節點,sum+=非葉節點的權值。
優先佇列預設是「大頂堆」,也就是top是最大的,而我們要用小頂堆,一直在遞增~一直在greater~所以要寫成:priority_queue, greater>
#include#includeusing namespace std;
#includepriority_queue, greater> q; //小頂堆實現哈夫曼樹!記住寫法
int n;
int main()
while(q.size()>1)
cout<
q.pop(); //清空根節點,準備迎接下一組資料
sum=0; //清空sum,準備迎接下一組資料
}return 0;
}
哈夫曼樹和哈夫曼編碼
1.帶權最短路徑wpl 2.哈夫曼樹是wpl最小的樹,但樹不一定唯一。左右子樹交換,大於二的同權重的樹的任意組合都會影響其唯一性。3.n個葉子節點的總節點數為2n 1。4.哈夫曼樹的建立,每次將兩個權重最小的樹組合乙個大樹 小樹消失,大樹插入。這裡的存在與否依據parent標記 直到還有一棵樹為止。...
哈夫曼樹和哈夫曼編碼
原文參照 1.基本概念 節點之間的路徑長度 在樹中從乙個結點到另乙個結點所經歷的分支,構成了這兩個結點間的路徑上的經過的分支數稱為它的路徑長度 樹的路徑長度 從樹的 根節點到樹中每一結點的 路徑長度之和。在結點數目相同的二叉樹中,完全二叉樹的路徑長度最短。結點的權 在一些應用中,賦予樹中結點的乙個有...
哈夫曼樹和哈夫曼編碼
在一般的資料結構的書中,樹的那章後面,著者一般都會介紹一下哈夫曼 huffman 樹和哈夫曼編碼。哈夫曼編碼是哈夫曼樹的乙個應用。哈夫曼編碼應用廣泛,如jpeg中就應用了哈夫曼編碼。首先介紹什麼是哈夫曼樹。哈夫曼樹又稱最優二叉樹,是一種帶權路徑長度最短的二叉樹。所謂樹的帶權路徑長度,就是樹中所有的葉...