哈夫曼树?
哈夫曼树是一种带权路径长度最短的二叉树,也称为最优二叉树。下面用一幅图来说明。
package com.sun.hafumanTree;
import java.security.PublicKey;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
public class hafumantree {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int arr[]={13,7,8,3,29,6,1};
Node root=create(arr);
preOrder(root);
}
public static void preOrder(Node root){
if(root !=null){
root.preOrder();
}
}
//创建哈夫曼树
public static Node create(int[] arr){
//1.遍历数组
//2.数组元素构成node
//3.将node放入ArrayList
List<Node> nodes=new ArrayList<Node>();
for (int value : arr) {
Node node=new Node(value);
nodes.add(node);
}
while(nodes.size()>1){
//排序从小到大
Collections.sort(nodes);
//取出根节点权值最小的二叉树
Node leftnode=nodes.get(0);
//取出根节点权值第二小的二叉树
Node rightnode=nodes.get(1);
///构建新的二叉树
Node parent=new Node(leftnode.value+rightnode.value);
parent.left=leftnode;
parent.right=rightnode;
//删除掉用过的节点
nodes.remove(leftnode);
nodes.remove(rightnode);
//将新构建的parent加入到nodes
nodes.add(parent);
}
return nodes.get(0);
}
//创建节点
//让节点实现Comparable接口
static class Node implements Comparable<Node>{
int value;//节点权值
Node left;//指向左子节点
Node right;//指向右子节点
public Node(int value) {
this.value = value;
}
@Override
public String toString() {
return "Node [value=" + value + ", left=" + left + ", right="
+ right + "]";
}
@Override
public int compareTo(Node o) {
// TODO Auto-generated method stub
//表示从小到大排序
return this.value - o.value;
}
//前序遍历
public void preOrder(){
System.out.println(this);
if(this.left != null){
this.left.preOrder();
}
if(this.right != null){
this.right.preOrder();
}
}
}
}