如何構造哈夫曼樹

 

樹:

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;
	}
 

這樣就獲取了,就給每一個結點設置了哈夫曼編碼,並已將所有有用的結點儲存到了隊列中。這其實就實現了將文件頭壓縮時文件編碼

的信息存入了隊列。哈夫曼就算完成了。

 

發佈了28 篇原創文章 · 獲贊 0 · 訪問量 3367
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章