哈弗曼树

哈弗曼树
1 建立哈夫曼树的节点类
     其中包括有节点数据和左右子树;
package com0423哈弗曼树;
/**
 * 建立哈弗曼树的节点
 * @author 孙瑞鸿
 */
public class HFMNode {
	public int data;
	public HFMNode right;
	public HFMNode left;
}

2 建立哈夫曼树类
             定义将数字数组转变为哈弗曼树节点数组的方法,哈弗曼树节点数组的排序,哈弗曼树的建立。
            
          
 /**
	 * 哈弗曼树类节点数组排序
	 * @param node:要排序的哈弗曼树类节点数组
	 */
	 public void sort(HFMNode[] node){
		 for(int i=0;i<node.length;i++){
			 for(int j=i+1;j<node.length;j++){
				 HFMNode temp=new HFMNode();
				 if(node[i].data>node[j].data){
					 temp=node[i];
					 node[i]=node[j];
					 node[j]=temp;
				 }
			 }
		 }
	}
	 /**
	 * 将数字数组转变为哈弗曼节点类数组
 	 * @param s:需要转变的数字数组
 	 * @return:转变后的哈夫曼数组首地址
 	 */
	public HFMNode[] toNode(int s[]){
		HFMNode[] node=new HFMNode[s.length];
		for(int i=0;i<s.length;i++){
			HFMNode n=new HFMNode();
			n.data=s[i];
			node[i]=n;
		}
		return node;
	}
	/**
	 * 建立哈夫曼树
	 * @param node:将要链接为哈夫曼树的节点数组
	 * @return:哈夫曼树的根节点
	 */
	public HFMNode createTree(HFMNode[] node){
		while(node.length>1){
			this.sort(node);
			HFMNode n1=node[0];
			HFMNode n2=node[1];
			HFMNode n3=new HFMNode();
			n3.data=n1.data+n2.data;
			n3.left=n1;
			n3.right=n2;
		//将node数组中的内容复制到nodes中并加入新的节点n3
			HFMNode[] nodes=new HFMNode[node.length-1];
			nodes[0]=n3;
				for(int i=1;i<node.length-1;i++){
					nodes[i]=node[i+1];
				}
			node=nodes;
		}
		return node[0];
	}

3 在主函数中输出   
     在主函数中实例化一个数组并赋值
     实例化哈弗曼树类,利用它的构造方法将数字数组传入;
     调用toNode(int s[])方法给哈弗曼数组赋值
    
调用输出函数将哈弗曼树输出
     /**
	 * 输出哈夫曼树的方法
	 * @param node:传入的节点
	 * @param code:节点数据的代码
	 */
	public static void print(HFMNode node,String code){
		   if(node.left==null&&node.right==null){
			   System.out.println(node.data+"的编码是:"+code);			   
		   }else{
			   if(node.left!=null){
				   print(node.left,code+"0");
			   }
			   if(node.right!=null){
				   print(node.right,code+"1");
			   }
		   }
	}

你可能感兴趣的:(哈弗曼树)