九、哈夫曼树(Huffman Tree)
1、概念
二叉树有n个节点,每个节点都有一个权值,所有叶子节点的权值最小的二叉树,被称为哈夫曼树。
若根节点的层数为1,则从根节点到第L层的节点的路径长度为L-1。
节点的权值,即带权路径长度(WPL,Weighted Path Length),节点与节点间的路径上,存在某个权值,某个节点与根节点的路径的权值之和,即节点的权值。
哈夫曼树中权值较大的节点,距离根节点较近(最优)。
2、转换过程
所有的元素值存放在叶子节点上。
- 将给定元素序列,依次添加到集合当中。
- 对集合按照节点的权重大小进行排序。
- 取出集合的前两个节点元素,作为左右子节点,创建父节点(权重为左右子节点的权重和),添加到集合中,并移除这两个子节点。
- 不断重复步骤2和步骤3,直到集合中只剩下一个节点元素(根节点)。
3、示例
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Stack;
class HuffmanTree<T> {
private TreeNode<T> root;
public HuffmanTree(T[] array) {
transfor(array);
}
private void transfor(T[] array) {
if (null == array || 0 == array.length) {
return;
}
int len = array.length;
List<TreeNode<T>> list = new ArrayList<TreeNode<T>>(len);
for (int i = 0; i < len; i++) {
list.