資料結構 哈夫曼二叉樹

2021-08-27 05:51:26 字數 1245 閱讀 2401

今天我們來實現乙個哈夫曼二叉樹又稱最優二叉樹

哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。

實現原理其實很簡單對於某一些場景來說,某乙個區間段情況出現的機率是大很多的,比如成績處於中游水平的人肯定是佔大多數的,因此我們在取得這些資料時,如果按等概率去讀取會影響程式效率

所以我們可以利用哈夫曼二叉樹來實現這一效率的提公升

以乙個字串為例構造哈夫曼二叉樹

其實實現方法非常簡單

第一步:統計字串中各個字母出現次數,並且生成節點 

第二步:根據節點的權值排序 

第三步:取出許可權最小的兩個節點,構建乙個新節點 

第四步:重複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個權值,則構造出的...