[java]java实现哈夫曼编码

二叉树的结点类:该类中包含结点的基本信息,在二叉树中的位置信息以及用flag表明该结点是否参加二叉树构造

/**
 * @author:zym
 * @description:node of binary tree
 * @date: 2017/4/6
 */
public class Node {
	public String name;//节点符号
	public int weight;//权重
	public Node parent;
	public Node leftChild;
	public Node rightChild;
	public boolean flag;
	public StringBuffer code;
	
	public Node(String n,int w){//不同包中的类对该方法的访问权限?
		name = n;
		weight = w;
		flag = true;
		code = new StringBuffer();
	}

	@Override
	public String toString() {
		return "Node [name=" + name + ", weight=" + weight + ", code=" + code + "]";
	}
	
}

排序类:采用快速排序对结点权重逆序排序

/**
 * @author:zym
 * @description: include all kinds of sort method
 * @date: 2017/4/6
 */
public class Sort {
	
	public static void swap(List<Node> nodes,int i,int j){
		Node temp = nodes.get(i);
		nodes.set(i, nodes.get(j));
		nodes.set(j, temp);
	} 	
	
	/**
	 * author:zym
	 * description: quickSort of List(reverse sequence)
	 * date:2017/4/6
	 */
	public static void quickSort(List<Node> nodes,int begin,int end){
		if(begin<end){
			Node key = nodes.get(begin);
			int i = begin,j = end;
			while(true){
				while(i<end&&nodes.get(i).weight>=key.weight) i++;
				while(j>begin&&nodes.get(j).weight<=key.weight) j--;
				
				if(i<j) swap(nodes,i,j);
				else break;
			}
			swap(nodes,begin,j);
			quickSort(nodes,begin,j-1);
			quickSort(nodes,j+1,end);
		}
	}
	
}


哈夫曼编码类:构造哈夫曼二叉树并编码

/**
 * @author:zym
 * @description: data structure of huffman binary tree
 * @date:2017/4/6
 */
public class HuffmanCode {
	public static void createTree(List<Node> nodes){
		Node left = null,right = null;
		int k = 0,//记录下第一次遍历的断点
			size = nodes.size();//记录nodes的初始结点数
	    
		while(true){
			Sort.quickSort(nodes, 0, nodes.size()-1);
			for(int i=1;i<nodes.size();i++){
				if(nodes.get(nodes.size()-i).flag){
					left = nodes.get(nodes.size()-i);
					k = i;
					break;	
				}
				left = null;
			}
			for(int j=k+1;j<nodes.size();j++){
				if(nodes.get(nodes.size()-j).flag){
					right = nodes.get(nodes.size()-j);
					break;
				}
				right = null;
			}
			if(left!=null&&right!=null){
				Node parent = new Node(null,left.weight+right.weight);
				parent.leftChild = left;
				parent.rightChild = right;
				left.parent = parent;
				right.parent = parent;
				left.flag = false;
				right.flag = false;
				nodes.add(parent);	
			}
			if(nodes.size()==2*size-1){
				Sort.quickSort(nodes, 0, nodes.size()-1);
				break;
			}
		}
	}
	
	/**
	 * author:zym
	 * description: code for huffman binary tree
	 * date:
	 */
	public static void codeTree(List<Node> nodes){
		for(int i=1;i<nodes.size();i++){
			if(nodes.get(nodes.size()-i).name!=null){//查找到所有叶子结点
				Node temp = nodes.get(nodes.size()-i),//暂存叶子结点
				     temp1 = null,//暂存待编码结点
				     parent = null;
				while(true){
					if(temp1 == null) temp1 = temp;
					if(temp1.parent!=null){ 
						parent = temp1.parent;
					}
					else break;
					if(parent.leftChild == temp1) temp.code.append("0");
					else temp.code.append("1");
					temp1 = parent;
				}
				//temp = nodes.get(nodes.size()-i);
				temp.code = temp.code.reverse();
			}
		}
	}
}

Test类

public class TestHuffmanCode {
	
	public static void main(String[] args){
		List<Node> nodes = new ArrayList<Node>();	
		nodes.add(new Node("a",4));
		nodes.add(new Node("b",6));
		nodes.add(new Node("c",5));
		nodes.add(new Node("d",12));
		nodes.add(new Node("e",3));
		
		HuffmanCode.createTree(nodes);
		HuffmanCode.codeTree(nodes);
		
		for(Node node:nodes){
			if(node.name!=null) System.out.println(node.toString());
		}
	}	
}

输出结果:




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值