a
b d e c
2 3 4 5 6 7 b c d e
d
e f g f g h
f
g
h
8
h
25
3、用孩子兄弟表示法来存储
思路:用二叉链表来表示树,但链表中的两个 指针域含义不同。 左指针指向该结点的第一个孩子; 右指针指向该结点的下一个兄弟结点。
firstchild data nextsibling
100
40
21 32 g e 17 7 a
60
28 11 10 h 6 d 2 c 5 3 f
10
对应的哈夫曼编码(左0右1):
符 编码 频率 符 编码 频率
100
a
b
1100
00
0.07
0.19
a
b
000
001
0.07
0.19 0.06
0 b
0 40
1
1
0 60 1 28 1 0 6 d 0 2 c 11 1d Path Length
树的带权路径长度如何计算? WPL = 哈夫曼树则是:WPL 最小的树。
w kl k
k=1
n
经典之例:
4 d
2 c 7 a (b) 5 b
Huffman树
7 a
7 a
5
2 b c
4 d
5 b
2 c (c)
4 d
(a)
WPL=36
WPL=46
WPL= 35
3
构造霍夫曼树的基本思想: 权值大的结点用短路径,权值小的结点用长路径。 构造Huffman树的步骤(即Huffman算法):
(1) 由给定的 n 个权值{w0, w1, w2, …, wn-1},构造具有 n 棵扩充 二叉树的森林F = { T0, T1, T2, …, Tn-1 },其中每一棵扩充二叉树 Ti 只有一个带有权值 wi 的根结点,其左、右子树均为空。 (2) 重复以下步骤, 直到 F 中仅剩下一棵树为止: ① 在 F 中选取两棵根结点的权值最小的扩充二叉树, 做为左、 右子树构造一棵新的二叉树。置新的二叉树的根结点的权值为 其左、右子树上根结点的权值之和。 ② 在 F 中删去这两棵二叉树。 ③ 把新的二叉树加入 F。