赫夫曼树(Java)
赫夫曼(Huffman )树 ,也称最优二叉树,是指对于一组带有确定权值的叶子结点,构造的具有最小带权路径长度 的二叉树。
- 二叉树的路径长度: 由根结点到所有叶子结点的路径长度之和
- 二叉树的带权路径长度: 从根结点到各个叶子结点的路径长度与相应结点权值的乘积之和
特点
- 权值越大的叶子结点越靠近根结点,而权值越小的叶子结点越远离根结点。
举个栗子
以结点权值集合为arr={1,4,2,6,5,3}的赫夫曼树的构造过程为:
- 先把给出结点权值集合按照升序(降序)排序(以升序为例)
- 取出结点权值最小的两个数,创建二叉树
- 把这两个权值最小的数除去,再把其父结点生成的结点权值放回原结点权值结合里,递归取出两个权值最小的数,创建二叉树;直到原结点权值集合为空
代码如下
import java.util.ArrayList;
import java.util.Collections;
public class Huffmantree2 {
public static void main(String[] args) {
int arr[]= {1,4,2,6,5,3};
Node root=creathuffmantree(arr);//返回创建后的赫夫曼树根结点
System.out.println("----遍历检查是否成功创建赫夫曼树----");
System.out.println("前序遍历结果为:");
preorder(root);
System.out.println("中序遍历结果为:");
infixorder(root);
}
public static void preorder(Node root) {//前序遍历
if(root!=null) {
root.preorder();
}
else {
System.out.println("二叉树为空!");
}
System.out.println();
}
public static void infixorder(Node root) {//中序遍历
if(root!=null) {
root.infixorder();
}else {
System.out.println("二叉树为空!");
}
System.out.println();
}
public static Node creathuffmantree(int[] arr) {//创建赫夫曼树
ArrayList<Node> no=new ArrayList<Node>();
for(int value:arr) {
no.add(new Node(value));
}
while(no.size()>1) {
Collections.sort(no);//升序排序
Node left=no.get(0);//取出权值最小的两个结点
Node right=no.get(1);
Node parent=new Node(left.value+right.value);//创建父结点
parent.left=left;//创建新的二叉树
parent.right=right;
no.remove(left);//删除已处理结点
no.remove(right);
no.add(parent);
}
return no.get(0);
}
}
class Node implements Comparable<Node>{//让Node 实现接口
int value;
Node left;
Node right;
public Node(int value) {
this.value=value;
}
public void preorder() {//前序遍历
System.out.print(this);
if(this.left!=null) {
this.left.preorder();
}
if(this.right!=null) {
this.right.preorder();
}
}
public void infixorder() {//中序遍历
if(this.left!=null) {
this.left.infixorder();
}
System.out.print(this);
if(this.right!=null) {
this.right.infixorder();
}
}
@Override
public String toString() {
return value+" " ;
}
public int compareTo(Node o) {//从小到大排序(从大到小排序为:return o.value-this.value)
return this.value-o.value;
}
}
运行结果
----遍历检查是否成功创建赫夫曼树----
前序遍历结果为:
21 9 4 5 12 6 6 3 3 1 2
中序遍历结果为:
4 9 5 21 6 12 3 6 1 3 2