哈夫曼树的基本概念
- 哈夫曼树: 假设有m个权值{w1,w2,···,wm},可以构造一棵含n个叶子结点的二叉树,每个叶子结点的权为wi,则其中带权路径长度WPL最小的二叉树称作最优二叉树或者哈夫曼树。
- WPL(树的带权路径长度):所有叶子结点的权乘上到根节点的距离的总和。
例子:四个叶子结点a b c d,分别带权 6 3 4 2,则构建哈夫曼树如图:
WPL = 6 * 1 + 4 * 2 + 2 * 3 + 3 * 3 = 29
哈夫曼树的构造算法
- 为了使WPL最小,用贪心思想容易知道,权越大的结点离根越近,这样构造出的树就是哈夫曼树。
哈夫曼树的构造过程
- 根据给定的n个权值{w1,w2,···,wm},构造n棵只有根结点的二叉树,这n棵二叉树构成一个森林F。
- 在森林F中选取两棵根结点最小的树作为左右子树构造一棵新的二叉树,且置新的二叉树的根结点的权值为其左、右子树上根结点的权值之和。
- 在森林F中删除这棵树,同时将新得到的二叉树加入F中。
- 重复2、3,直到F只含一棵树为止。这颗树便是哈夫曼树。
概括:说白了,就是每次在所有树中找到根最小的两个合并成一棵树,不断重复,直到剩一棵树为止。
例子:同样用四个叶子结点a b c d,分别带权 6 3 4 2,则构建哈夫曼树如图:
- 构造只有4棵只有根结点的二叉树。
- 不断合并最小的两棵树(① b和d最小,合并得到权值为5的树 ② c和权值为5的新树最小,合并得到权值为7的树 ③ 最后a和权值为7的树合并,得到权值为13的树)
哈夫曼树编码
-
哈夫曼编码:对一棵具有n个叶子的哈夫曼树,若对树中的每个左分支赋予0,右分支赋予1,则从根到每个叶子的路径上,各分支的赋值分别构成一个二进制串,该二进制串就为哈夫曼编码。
-
哈夫曼编码是最优的前缀编码。
例子:
如图
哈夫曼编码为:
a:0
b:111
c:10
d:110