7、下列结点的权值如表: 结点 a b c d e f g h 权值 70 40 13 50 4 8 2 100 请用这些结点构造一棵哈夫曼树;求出每个结点的哈夫曼编码;求出哈夫曼树的WPL。
时间: 2024-05-04 19:19:50 浏览: 203
首先,我们需要将这些结点按照权值从小到大排列:
c(13) e(4) f(8) g(2) b(40) d(50) a(70) h(100)
接下来,我们需要构造哈夫曼树。我们可以按照以下步骤:
1. 取出权值最小的两个结点 g(2) 和 f(8),合并成一个新结点 gf,其权值为 2+8=10。
2. 将 gf 插入到原来排好序的结点序列中,得到新的序列:
c(13) e(4) gf(10) b(40) d(50) a(70) h(100)
3. 再次取出权值最小的两个结点 e(4) 和 c(13),合并成一个新结点 ec,其权值为 4+13=17。
4. 将 ec 插入到序列中,得到新的序列:
ec(17) gf(10) b(40) d(50) a(70) h(100)
5. 再次取出权值最小的两个结点 gf(10) 和 ec(17),合并成一个新结点 gfec,其权值为 10+17=27。
6. 将 gfec 插入到序列中,得到新的序列:
gfec(27) b(40) d(50) a(70) h(100)
7. 接下来,取出权值最小的两个结点 b(40) 和 gfec(27),合并成一个新结点 bgfec,其权值为 40+27=67。
8. 将 bgfec 插入到序列中,得到新的序列:
bgfec(67) d(50) a(70) h(100)
9. 再次取出权值最小的两个结点 d(50) 和 bgfec(67),合并成一个新结点 dbgfec,其权值为 50+67=117。
10. 将 dbgfec 插入到序列中,得到新的序列:
dbgfec(117) a(70) h(100)
11. 最后,将 a(70) 和 h(100) 合并成一个新结点 ah,其权值为 70+100=170。
12. 将 ah 插入到序列中,得到新的序列:
dbgfec(117) ah(170)
13. 这个序列只剩下两个结点了,将它们合并成根结点,得到一棵哈夫曼树:
```
287
/ \
170 117
/ \ / \
a h bgfec d
/ \
gfec b
/ \
gf ec
/ \ / \
g f e c
```
接下来,我们需要求出每个结点的哈夫曼编码。从根节点开始,向左走标记为0,向右走标记为1,直到叶子节点为止。
- ah: 0
- d: 110
- bgfec: 111
- b: 100
- gfec: 1010
- c: 1011
- f: 11000
- e: 11001
- g: 11010
最后,我们需要求出哈夫曼树的WPL(带权路径长度)。每个叶子结点的WPL为该结点的权值乘以其深度,而哈夫曼树的WPL为所有叶子结点的WPL之和。因此,我们可以计算出:
WPL = 70*1 + 100*1 + 40*2 + 50*2 + 13*3 + 8*3 + 2*4 + 10*4 = 1004
因此,这棵哈夫曼树的WPL为1004。
阅读全文