哈夫曼树
给定 n 个权值,作为 n 个叶子结点,构造一个二叉树,如果该树的带权路径长度最小,就称该二叉树为最优二叉树,也称为哈夫曼树。
构建步骤
- 将权值序列从小到大排序,每个权值都看作是一个简单的二叉树。
- 取出根节点权值最小的两棵二叉树,组成一棵新的二叉树,新二叉树的根节点的值为它左右子节点的值之和。注意:对某个节点,构建过程中,使其右子节点权值不小于左子节点权值
- 以现有的二叉树的根节点的值,重新排序,重新执行步骤2。直到初始权值序列中每一个节点都加入到二叉树中,这样就构成一棵哈夫曼树。
代码如下
- 定义节点类
public class Node implements Comparable<Node> {
private int value;
private Node leftNode;
private Node rightNode;
public Node(int value) {
this.value = value;
}
//getter setter toString
//前序遍历
public void preOrder(){
System.out.println(this);
if (this.getLeftNode() != null