import java.util.*;
/**
* @author Jajing
*/
public class hafuman {
private static class Node implements Comparable<Node>{
Node parent;
Node leftChild;
Node rightChild;
String data;
int weight;
Node(String data,int weight){
this.data = data;
this.weight =weight;
}
@Override
public int compareTo(Node o) {
//倒序
return o.weight - this.weight;
}
}
public static void main(String[] args) {
//優(yōu)先隊(duì)列
PriorityQueue<Node> pQueue = new PriorityQueue();
pQueue.offer(new Node("A",20));
pQueue.offer(new Node("B",15));
pQueue.offer(new Node("C",10));
pQueue.offer(new Node("D",5));
pQueue.offer(new Node("E",1));
Node root = constuctHafumanTree(pQueue);
//廣度優(yōu)先遍歷隊(duì)列
Queue<Node> bfsQueue = new LinkedList<Node>();
//加入根結(jié)點(diǎn)
bfsQueue.offer(root);
//結(jié)果隊(duì)列
Queue<Node> results = new LinkedList<Node>();
while(!bfsQueue.isEmpty()){
Node current = bfsQueue.poll();
Node leftChild = current.leftChild;
Node rightChild = current.rightChild;
//葉子結(jié)點(diǎn)為數(shù)據(jù)結(jié)點(diǎn),加入結(jié)果隊(duì)列
if(leftChild== null && rightChild == null){
results.offer(current);
}
//右結(jié)點(diǎn)權(quán)重大臣咖,if判斷一定要在前
if(rightChild != null){
bfsQueue.offer(rightChild);
}
//左結(jié)點(diǎn)權(quán)重小跃捣,if判斷一定要在后
if(leftChild != null){
bfsQueue.offer(leftChild);
}
}
//測(cè)試結(jié)果
List<String> list = new ArrayList<String>();
StringBuilder sb = new StringBuilder();
for(Node node:results){
String code = getHafumanCode(node);
list.add(node.data+":"+code);
sb.append(code);
}
System.out.println(sb.toString());
for(String s:list){
System.out.println(s);
}
/**
* codeSTR: 10100100010000
* E:1
* D:01
* C:001
* B:0001
* A:0000
*/
}
//構(gòu)建哈夫曼樹
public static Node constuctHafumanTree(PriorityQueue<Node> pQueue){
while(pQueue.size() > 1){
Node left = pQueue.poll();//小權(quán)重結(jié)點(diǎn)在左
Node right = pQueue.poll();//大權(quán)重結(jié)點(diǎn)在右
Node parent = new Node("P",left.weight+right.weight);//往上冒
parent.leftChild = left;
parent.rightChild = right;
left.parent = parent;
right.parent = parent;
pQueue.offer(parent);
}
//root結(jié)點(diǎn)
return pQueue.poll();
}
//拿到哈夫曼編碼
public static String getHafumanCode(Node node){
//遍歷是由底往上,比如001需要壓棧最后取出轉(zhuǎn)為100
Stack<Integer> codeStack = new Stack<Integer>();
Node parent = node.parent;
while(node != null && parent != null){
if(node.parent.rightChild == node){
codeStack.push(1);
}else{
codeStack.push(0);
}
node = parent;
parent = node.parent;
}
StringBuilder sb = new StringBuilder();
while(!codeStack.isEmpty()){
sb.append(codeStack.pop());
}
return sb.toString();
}
}
哈夫曼樹朝蜘,哈夫曼編碼
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
- 文/潘曉璐 我一進(jìn)店門牺氨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來狡耻,“玉大人墩剖,你說我怎么就攤上這事∫恼” “怎么了岭皂?”我有些...
- 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)沼头。 經(jīng)常有香客問我爷绘,道長(zhǎng),這世上最難降的妖魔是什么瘫证? 我笑而不...
- 正文 為了忘掉前任揉阎,我火速辦了婚禮,結(jié)果婚禮上背捌,老公的妹妹穿的比我還像新娘毙籽。我一直安慰自己,他們只是感情好毡庆,可當(dāng)我...
- 文/花漫 我一把揭開白布坑赡。 她就那樣靜靜地躺著,像睡著了一般么抗。 火紅的嫁衣襯著肌膚如雪毅否。 梳的紋絲不亂的頭發(fā)上,一...
- 文/蒼蘭香墨 我猛地睜開眼黍图,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了奴烙?” 一聲冷哼從身側(cè)響起助被,我...
- 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎切诀,沒想到半個(gè)月后揩环,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
- 正文 獨(dú)居荒郊野嶺守林人離奇死亡幅虑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
- 正文 我和宋清朗相戀三年丰滑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片翘单。...
- 正文 年R本政府宣布认臊,位于F島的核電站圃庭,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏失晴。R本人自食惡果不足惜剧腻,卻給世界環(huán)境...
- 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望涂屁。 院中可真熱鬧书在,春花似錦、人聲如沸拆又。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽帖族。三九已至栈源,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間竖般,已是汗流浹背甚垦。 一陣腳步聲響...
- 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像胞谭,于是被迫代替她去往敵國和親垃杖。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
推薦閱讀更多精彩內(nèi)容
- 原文鏈接:http://blog.csdn.net/itplus/article/details/37969817...
- 堆 什么是堆 優(yōu)先隊(duì)列(Priority Queue):特殊的“隊(duì)列”彩库,取出元素的順序是 依照元素的優(yōu)先權(quán)(關(guān)鍵字...
- 1.帶權(quán)路徑長(zhǎng)度(WPL): 設(shè)二叉樹有n個(gè)葉子結(jié)點(diǎn),每個(gè)葉子結(jié)點(diǎn)帶有權(quán)值 wk先蒋,從根結(jié)點(diǎn)到每個(gè)葉子結(jié)點(diǎn)的長(zhǎng)度為 ...
- 哈夫曼樹 哈夫曼樹實(shí)現(xiàn)思路: 形成分段式解決方案骇钦,把形成的N個(gè)樹結(jié)構(gòu)反復(fù)合并(兩兩合并)。每當(dāng)兩個(gè)樹結(jié)構(gòu)合并一次竞漾,...
- 1. 引入 例:將百分制的考試成績(jī)轉(zhuǎn)換為五分制成績(jī)眯搭。 2. 哈夫曼樹的定義 3. 哈夫曼樹的構(gòu)造 將權(quán)值從小到大進(jìn)...