树的带权路径长度规定为所有叶子结点的带权路径长度之和,记为WPL。哈夫曼树又称为最优树,即构造WPL值最小的树。
构造思路:
假设有n个权值,则构造出的哈夫曼树有n个叶子结点。 n个权值分别设为 w1、w2、…、wn,则哈夫曼树的构造规则为:
- 将w1、w2、…,wn看成是有n 棵树的森林(每棵树仅有一个结点);
- 在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左、右子树,且新树的根结点权值为其左、右子树根结点权值之和;
- 从森林中删除选取的两棵树,并将新树加入森林;
- 重复2、3步,直到森林中只剩一棵树为止,该树即为所求得的哈夫曼树。
源代码实现如下:
package tree;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Queue;
import tree.BinaryTree.Node;
public class HuffmanTree {
public static class Node {
//定义树结点
String data;
int weight;
Node left;
Node right;
public