今天我們來實現乙個哈夫曼二叉樹又稱最優二叉樹
哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。
實現原理其實很簡單對於某一些場景來說,某乙個區間段情況出現的機率是大很多的,比如成績處於中游水平的人肯定是佔大多數的,因此我們在取得這些資料時,如果按等概率去讀取會影響程式效率
所以我們可以利用哈夫曼二叉樹來實現這一效率的提公升
以乙個字串為例構造哈夫曼二叉樹
其實實現方法非常簡單
第一步:統計字串中各個字母出現次數,並且生成節點
第二步:根據節點的權值排序
第三步:取出許可權最小的兩個節點,構建乙個新節點
第四步:重複2 3,直到只剩乙個節點,該節點就是根節點。
首先我們還是需要乙個節點類,具有左右子節點屬性,以及資料域,和權值屬性
public class node
public node(string str,int value)
public node(string str,node left,node right)
}
三個構造方法分別用來建立空節點,根節點,以及根據資料和左右子節點建立節點
然後分別設定屬性的set和get方法
再新建huffmatree類,除了根節點屬性之外還可以用乙個字串來儲存哈夫曼編碼所構成的01串
public class huffmatree
使用構造方法建樹
public huffmatree(string str)
//得到具有權值的節點陣列佇列
for(int j=0;j0)
} arraylistno=mp(nodelist);//第一次排序
for(int i=0;i1){
//取出權值最小的兩個節點
node left=no.remove(0);
node right=no.remove(0);
//根據最小的兩個節點生成父節點
node father=new node(left.getstr()+right.getstr(), left, right);
no.add(father);//將新建的節點加入佇列
mp(no);//每次加入父節點之後都進行一次排序
for(int i=0;i其實就是不停的取出權值最小的節點,以及將新產生的節點存入佇列,排序之後重複建節點。
這樣我們就將乙個字串生成了一顆哈夫曼二叉樹,不過還是建議遍歷二叉樹驗證一下結果。
資料結構 (二叉樹 哈夫曼編碼)
實現哈夫曼樹的建立演算法,並按哈夫曼樹實現哈夫曼編碼演算法。include include include include define maxvalue 10000 define maxleaf 30 葉子結點數 define maxnode maxleaf 2 1 樹中結點總數 using na...
資料結構筆記(樹 二叉樹與森林 哈夫曼)
一 樹 兄弟關係 二叉樹 雙親和右孩子 二 樹 雙親和長子 二叉樹 雙親和左孩子 樹的前序遍歷等價於二叉樹的前序遍歷 樹的後序遍歷等價於二叉樹的中序遍歷 一 森林轉換為二叉樹 1 將森林中的每棵樹轉換成二叉樹 2 從第二棵二叉樹開始,依次把後一棵二叉樹的根結點作為前一棵二叉樹根結點的右孩子,當所有二...
哈夫曼樹(最優二叉樹)
給定n個權值作為n的 葉子結點,構造一棵二叉樹,若帶權路徑長度達到最小 所謂樹的帶權路徑長度,就是樹中所有的葉結點 的權值乘上其到根結點的路徑長度 稱這樣的二叉樹為最優二叉樹,也稱為哈夫曼樹 huffman tree 哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。假設有n個權值,則構造出的...