給定n個權值作為n個葉子結點,構造一棵二叉樹,若該樹的帶權路徑長度達到最小,稱這樣的二叉樹為最優二叉樹,也稱為哈夫曼樹(huffman tree)。哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。、權值可以看作節點中存放的值,路徑長度即為該葉子節點所處的層數減去1。其中 路徑長度*節點權值 相加之和最小的樹則為最優二叉樹。
(非葉子節點的權值僅為下面比較所用,並非我們存入的資料)
節點
static
class
node
implements
comparable
public
node
(int val, node left, node right)
@override
public string tostring()
';}/**
* 從小到大排序
* @param o
* @return
*/@override
public
intcompareto
(node o)
}
為了實現節點能排序所以實現了comparable介面。
赫夫曼樹
此方法接受乙個陣列,第一步則是構造出節點放進列表。
while迴圈中每次都會先排序,這樣便可輕易取出權值倒數第一第二小的節點。
構建乙個新的二叉樹,其權值是上面兩個節點的權值之和。並且把上面兩個節點變成它的子樹。
構建成功便可刪除兩個節點,並把新構建的節點放入列表進行下一次迴圈
迴圈過後便會留下唯一乙個子樹,返回即可。
public
static node formhuffman
(int
arr)
while
(nodes.
size()
>1)
return nodes.
get(0)
;}
測試
int
arr =
;//前序遍歷
preorder
(formhuffman
(arr)
);
node
node
node
node
node
node
node
node
node
node
node
node
node
node
node
node
node
node
node
node
node
node
node
node
node
process finished with exit code 0
赫夫曼樹 C 實現
赫夫曼樹,即最優二叉樹。給定n個權值作為n個葉子結點,構造一棵二叉樹,若該樹的帶權路徑長度達到最小,稱這樣的二叉樹為最優二叉樹,也稱為哈夫曼樹 huffman tree 哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。構造赫夫曼樹 1.把節點的權值按從小到大的順序排列。2.從序列中取出前兩個...
哈夫曼樹,赫夫曼樹
參考 赫夫曼樹,別名 哈夫曼樹 最優樹 以及 最優二叉樹 當用 n 個結點 這些結點都作為葉子結點且都有各自的權值 試圖構建一棵樹時,如果構建的這棵樹的帶權路徑長度最小,稱這棵樹為 最優二叉樹 有時也叫 赫夫曼樹 或者 哈夫曼樹 構建哈夫曼樹 在 n 個權值中選出兩個最小的權值,對應的兩個結點組成乙...
赫夫曼樹 樹
在資料膨脹,資訊 的今天,資料壓縮的意義不言而喻。談到資料壓縮,就不能 不提赫夫曼編碼,赫夫曼編碼是首個使用的壓縮編碼方案,即使在今天的知名壓縮演算法裡,依然可以見到赫夫曼編碼的影子。另外,在資料通訊中,用二進位製給每個字元進行編碼時不得不面對乙個問題是如何使電文總長最短且不產生二義性。根據字元出現...