在通常
1.首先我們要建立乙個(節點類node)定義樹中節點的屬性,屬性有:存放字元資料變數,存放權值變數,左路徑,右路徑。
// 繼承comparable類,用於使用裡面的排序方法
public
class
node
implements
comparable
// 使用comparable裡的方法進行公升序排序
@override
public
intcompareto
(node o)
@override
public string tostring()
// 前序遍歷
public
void
preorder()
if(this
.right != null)
}}
2.再定義乙個字元型別陣列,用於裝字串中的每個字元
public
static
void
main
(string[
] args)
將字元陣列中的元素轉化成節點,並儲存到集合中:
1.1.首先定義乙個arraylist
1.2.然後定義乙個map的變數來接收hashmap型別資料,其中byte型別表示為nodes資料內容,integer表示為次數
2.1.然後用迴圈遍歷字元陣列(bytes)
2.2.迴圈體內先用前面宣告的型別integer定義變數count迴圈獲取字元的出現次數
2.3.因為有可能獲取到,有可能獲取不到,所以再判斷count是否等於空
為空的話表示map還沒有整個字元資料,則第一次新增次數為1:counts.put(b,1)
反之表示不是第一次則 再原來的基礎上++
3.1.遍歷完後把每個字元與屬性內容轉成節點 node物件,並加入到nodes集合中
迴圈遍歷map,原理和 for(型別 下標變數 : 變數目標) 一樣
public
static arraylist
getnodes (
byte
bytes)
else
}// 3.1
for(map.entry
entry: counts.
entryset()
)return nodes;
}
根據arraylist集合建立乙個對應的赫夫曼樹
1.1因為數列裡的節點一直相加 去除 新增 到最後只剩下最後的乙個節點,就是根節點,所以使用while
迴圈的條件為:當集合的長度大於1時迴圈
1.2迴圈中先使用collections.sort()方法進行公升序排序
1.3然後定義節點變數leftnode與rightnode儲存集合中的最小值和次小值,也就是排序後集合的第0個與第1個節點
1.4並建立 new出根節點parent,並且它的根節點只有權值沒有字元或ascii碼,所以data部分為空,
權值為leftnode與rightnode權值相加:node parent = new node(null,leftnode.weight + rightnode.weight);
1.5並且根節點左右路徑鏈結上leftnode與rightnode
1.6然後使用集合中的方法,從集合中去除掉處理過的節點,並加入相加出來的根節點parent到集合中
private
static node createhuffmantree
(arraylist
nodes)
return nodes.
get(0)
;}
赫夫曼編碼
include include using namespace std typedef struct htnode,huffmantree 動態分配陣列儲存赫夫曼樹 typedef char huffmancode 動態分配陣列儲存赫夫曼編碼 赫夫曼編碼的演算法實現 void sethuffmant...
赫夫曼編碼
用赫夫曼樹進行編碼是我們處理資料壓縮常用的方法。請同學們用赫夫曼編碼方法儲存你班同學 資料結構 課程的期終考試成績。include include include include define ok 1 define maxnn 100000 typedef struct studentstuden...
赫夫曼編碼
問題r 赫夫曼編碼 思路 對於赫夫曼來說,往左走為0,往右走為1,可以發現每一位就往下走一層。因此整體報文的長度可以用不同報文在樹中的位置來確定,也就是說,符號種類 每個符號在樹中的深度即為整體報文的長度 而ascll碼的位元位長度為符號個數 8 include include include us...