樹:
1.概念
樹其實只是含有多個指針域的鏈表,一個結點可以指向多個子結點,其形狀如樹一樣開支散葉,所以稱之爲樹。其結構與鏈表基本一樣,操作也相似。
2.哈夫曼樹:
哈夫曼樹是一種帶全路徑最短的樹,因此在信息檢索中很有用。
1.建造哈夫曼樹;
哈夫曼樹是帶權值組成結點組成的,所以結點屬性應當有屬性
public class Node {
//要存儲的數據
private String data;
//在文件中出現的次數
private int count =0;
//用來做生在父類的左子樹,或者右子樹的標識,如果是做左子樹爲0;右子樹爲1。
private String symbol ="" ;
//節點的父節點
private Node leftchild;
//節點的孩子節點
private Node rightchild;
}
哈夫曼樹是由一個結點數據出現次數來建造樹的,所以所有的結點應當事先準備好,儲存於隊列之中,排好序。這個可以用優先隊列來實現功能,也可以自己寫一個自定義隊列來實現。
public void creatTree(Queue q){
//當隊列的的長度大於一時,始終前兩個結點相連起來,構建樹
while(q.size()>1){
Node node1 = q.getNode();//取出第一個結點
Node node2 = q.getNode();//取出第二個結點
//構建父節點
Node node = new Node(" ",node1.getCount()+node2.getCount());
//建立結點樹
node.setLeftchild(node1);
node1.setSymbol("0");
node.setRightchild(node2);
node2.setSymbol("1");
//將新生成的父結點加入隊列中
q.add(node);
}
this.root = q.getNode();
}
這個隊列是我自己寫的一個隊列,當你取出這個元素時,元素就被移除,添加元素時,自動根據count大小,找到位置排列。
這樣一顆哈夫曼樹就被建造起來,再遍歷獲得哈夫曼編碼,就ok了,
public Queue ergodic(Node node,String str) {
// 設計指針 並指向頭結點
Node temp = new Node("指針",0);
temp = node;
// 設置出口
if (null==temp.getLeftchild() && null==temp.getRightchild() ) {
temp.setSymbol(str);
q.add(temp);
}
else{
ergodic(node.getLeftchild(),str+"0");
ergodic(node.getRightchild(), str+"1");
}
return q;
}
這樣就獲取了,就給每一個結點設置了哈夫曼編碼,並已將所有有用的結點儲存到了隊列中。這其實就實現了將文件頭壓縮時文件編碼
的信息存入了隊列。哈夫曼就算完成了。