1. 程式人生 > >Java資料結構之哈夫曼樹

Java資料結構之哈夫曼樹

import java.util.*;
public class TestHuffmanTree {
	public static void main(String [] args){
		HuffmanTree<Integer>hfTree = new HuffmanTree<Integer>();
		hfTree.insert(3, 3);
		hfTree.insert(2, 2);
		hfTree.insert(1, 1);
		hfTree.insert(4, 4);
		hfTree.insert(6, 6);
		hfTree.insert(5, 5);
		hfTree.bulidTree();
		System.out.println("哈夫曼樹前序遍歷");
		hfTree.preOrder(hfTree.root);
		System.out.println("\n哈夫曼樹中序遍歷");
		hfTree.inOrder(hfTree.root);
		System.out.println("\n哈夫曼樹後序遍歷");
		hfTree.postOrder(hfTree.root);
	}
}

class HuffmanTree<T>{
	class Node{
		private T data;
		private int weight;
		private Node left;
		private Node right;
		public Node(T data,int weight){
			this.data = data;
			this.weight = weight;
		}
	}
	public Node root;
	public Comparator <Node> cmp = new Comparator<Node>(){
		public int compare(Node node_1,Node node_2){
			return (int) (node_1.weight - node_2.weight);
		}
	};
	PriorityQueue <Node>q= new PriorityQueue<Node>(cmp);
	public HuffmanTree(){
		root = null;
		q.clear();
	}
	public void insert(T element,int Weight){
		Node node = new Node(element,Weight);
		q.add(node);
	}
	public void bulidTree(){
		while(q.size() > 1){
			Node left = q.poll();
			Node right = q.poll();
			Node newNode = new Node(null,left.weight+right.weight);
			newNode.left = left;
			newNode.right = right;
			q.add(newNode);
		}
		root = q.poll();
	}
	public void preOrder(Node root){
		if(root != null){
			System.out.print(root.weight+" ");
			preOrder(root.left);
			preOrder(root.right);
		}
	}
	public void inOrder(Node root){
		if(root != null){
			inOrder(root.left);
			System.out.print(root.weight+" ");
			inOrder(root.right);
		}
	}
	public void postOrder(Node root){
		if(root != null){
			postOrder(root.left);
			postOrder(root.right);
			System.out.print(root.weight+" ");
		}
	}
}