赫夫曼树(最优二叉树)
1. 简介
定义: 赫夫曼树是n个带权叶子结点构成的所有二叉树中,带权路径长度(WPL)最小的二叉树。
叶子结点的带权路径: 叶子结点权值*到根节点的路径长度(叶结点的层数)
树的带权路径长度WPL(weighted path length):树中所有叶子结点的带权路径长度之和。
举个栗子:
如上图:WPL=3*2+5*2+8*2+9*2=50
问题: 将以上由[3,5,8,9]为叶子节点二叉树变成一棵赫夫曼树(也需要3/5/8/9为叶子结点)
思考:从赫夫曼树的定义可知-需要WPL最小,所以我们要将权值小的叶子结点放在下面,大的放在上面
构造赫夫曼树的方法:
令集合 T{3,5,8,9},
a. 选出权值最小的两个结点(即3和5) 作为左右子树构造新的树,
将新结点的权值设置为左右两结点值之和,如下图
b.在集合中删除选出的两个结点值,增加新结点的值T{ 8,8,9}
c.重复以上步骤,直到最后集合中只剩下一个元素为止,最后得到以下的一棵树:
这样就构造出了一棵赫夫曼树,也就是我们的最优二叉树
2. 代码实现
结点类 Node.java
//赫夫曼树
public class Node implements Comparable<Node>{
int value;
Node left;
Node right;
public Node(int value) {
this.value