import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
import design.BTree.BTNode;
public class HuffMan<AnyType> {
HNode root=new HNode();
class HNode<AnyType>{
double data;
HNode left;
HNode right;
public HNode(double data){
this.data=data;
}
public HNode(){}
}
//创建哈夫曼树
public HNode creatTree(){
Queue<Double> q=new LinkedList();
Scanner sc=new Scanner(System.in);
System.out.println("请输入权的个数");
int numble=sc.nextInt();
HNode rootNode[]=new HNode[numble-1]; //存放每组的根
int r=0;
double w[]=new double[numble];
System.out.println("请逐个输入权值,用空格隔开");
for(int i=0;i<numble;i++){
w[i]=sc.nextDouble();
}
w=maopao(w); //对权值进行排序
for(int i=0;i<w.length;i++){
q.add(w[i]);
}
HNode node=new HNode();
while(!q.isEmpty()){
double n1=q.remove(); //选出权值最小的两个
double n2=q.remove();
HNode node1=new HNode(n1);
HNode node2=new HNode(n2);
HNode root=new HNode(n1+n2); //得出根
root.left=node1;
root.right=node2;
numble=numble-2;
if(numble>0){
q.add(n1+n2);
numble++;
double w2[]=new double[numble];
for(int i=0;i<numble;i++){ //新的权值
w2[i]=q.remove();
}
w2=maopao(w2); //排序
for(int i=0;i<numble;i++){ //重新入队
q.add(w2[i]);
}
}//if
rootNode[r]=root; //将根存入数组
r++;
}//while
for(int i=0;i<rootNode.length;i++)
for(int j=i+1;j<rootNode.length;j++){
if(rootNode[i].data==rootNode[j].left.data){ //将所有结点连起来
rootNode[j].left.left=rootNode[i].left;
rootNode[j].left.right=rootNode[i].right;
break;
}
if(rootNode[i].data==rootNode[j].right.data){ //将所有结点连起来
rootNode[j].right.left=rootNode[i].left;
rootNode[j].right.right=rootNode[i].right;
break;
}
}
return rootNode[rootNode.length-1]; //返回最大的根
}
public double[] maopao(double b[]){
double a[]=b.clone();
for(int i=0;i<a.length-1;i++){
for(int j=0;j<a.length-1-i;j++){
if(a[j+1]<=a[j]){
double temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
return a;
}
//层次非递归遍历
public void levelOrder(HNode root){
int i=0;
Queue<HNode> q=new LinkedList<HNode>();
q.add(root);
while(q.isEmpty()!=true){
HNode step=q.remove();
System.out.print(step.data+" ");
if(step.left!=null){
q.add(step.left);
}
if(step.right!=null){
q.add(step.right);
}
}
System.out.println();
}
public static void main(String[] args) {
HuffMan h=new HuffMan();
h.root=h.creatTree();
System.out.println("遍历");
h.levelOrder(h.root);
}
}