一天乙個演算法,邊回想演算法細節,邊撿回c++,試驗性程式,留作記念。
哈夫曼(huffman)樹又稱最優二叉樹。它是n個帶權葉子結點構成的二叉樹中,帶權路徑長度wpl最小的二叉樹。因為構造這種樹的演算法是最早由哈夫曼於2023年提出的,所以被稱之為哈夫曼樹。
二叉樹中有五點性質非常重要,需要記住。
性質1:在二叉樹的第 i 層上至多有2^(i-1)個結點
性質2:深度為k的二叉樹至多有2^k-1個結點
性質3:對任何一顆二叉樹t,如果其終端結點數為n0,度為2的結點數為n2,則n0=n2+1
性質4:具有n個結點的完全二叉樹的深度為[log(n)]+1([x]表示不大於x的最大整數)
性質5:如果對一棵有n個結點的完全二叉樹(其深度為[log(n)]+1)的結點按層序編號(從第1層到第[log(n)]+1層,每層從左到右),對任一結點i(1<=i<=n)有:
(1).如果i=1,則結點i是二叉樹的根,無雙親;如果i>1,則其雙親是結點[i/2]
(2).如果2i>n,則結點i無左孩子(結點i為葉子結點);否則其左孩子是結點2i
(3).如果2i+1>n,則結點i無右孩子;否則其右孩子是結點2i+1
結點的權
「權」就相當於「重要度」,我們形象的用乙個具體的數字來表示,然後通過數字的大小來決定誰重要,誰不重要。
路徑
樹中從「乙個結點」到「另乙個結點」之間的分支。
路徑長度
乙個路徑上的分支數量。
樹的路徑長度
從樹的根節點到每個節點的路徑長度之和。
節點的帶權路徑路徑長度
其實也就是該節點到根結點的路徑長度乘以該節點的權。
樹的帶權路徑長度
樹中各個葉節點的路徑長度*該葉節點的權的和,常用wpl(weight path length)表示。
第一步: 我們將所有的節點都作為獨根結點。
第二步: 我們將最小的c和a組建為乙個新的二叉樹,權值為左右結點之和。
第三步: 將上一步組建的新節點加入到剩下的節點中,排除上一步組建過的左右子樹,我們選中b組建新的二叉樹,然後取權值。
第四步: 同上。
哈夫曼樹及哈夫曼編碼 C
說明 1.讀取檔案中需進行哈夫曼編碼的資料資訊 2.構造生成單節點二叉樹組 森林 3.構造哈夫曼樹 4.進行哈夫曼編碼 5.輸出對應資料及其編碼 include include includeusing namespace std const int max n 100 最大容量 const int...
哈夫曼編碼 哈夫曼樹
1.定義 哈夫曼編碼主要用於資料壓縮。哈夫曼編碼是一種可變長編碼。該編碼將出現頻率高的字元,使用短編碼 將出現頻率低的字元,使用長編碼。變長編碼的主要問題是,必須實現非字首編碼,即在乙個字符集中,任何乙個字元的編碼都不是另乙個字元編碼的字首。如 0 10就是非字首編碼,而0 01不是非字首編碼。2....
哈夫曼樹 哈夫曼編碼
定義從a結點到b結點所經過的分支序列為從a結點到b結點的路徑 定義從a結點到b結點所進過的分支個數為從a結點到b結點的路徑長度 從二叉樹的根結點到二叉樹中所有結點的路徑長度紙盒為該二叉樹的路徑長度 huffman樹 帶權值路徑長度最小的擴充二叉樹應是權值大的外界點舉例根結點最近的擴充二叉樹,該樹即為...