给定权值7、18、3、32、5、26、12、8,构造哈夫曼树
时间: 2023-07-10 09:39:22 浏览: 45
首先,将这些权值从小到大排序,得到3、5、7、8、12、18、26、32。
然后,取出权值最小的两个节点3和5,合并成一个新的节点,权值为它们的和8。此时得到的哈夫曼树如下所示:
```
8
/ \
3 5
```
接着,取出权值最小的两个节点7和8,合并成一个新的节点,权值为它们的和15。此时得到的哈夫曼树如下所示:
```
15
/ \
7 8
/ \ / \
3 5 12 18
```
继续,取出权值最小的两个节点12和15,合并为一个新节点,权值为它们的和27。此时得到的哈夫曼树如下所示:
```
27
/ \
15 12
/ \ / \
7 8 3 5
\
26
```
最后,将剩下的节点依次加入哈夫曼树中,得到最终的哈夫曼树:
```
93
/ \
42 51
/ \ / \
18 24 26 25
/ \ /
7 11 12
/ \
3 5
```
相关问题
给定权值构造哈夫曼树
哈夫曼树是一种带有权值的二叉树,它的构造方法是通过贪心策略,将权值最小的两个节点合并成一个新节点,直到最后只剩下一个节点为止。下面是给定权值构造哈夫曼树的详细步骤:
1. 将所有权值作为叶子节点,构造一个节点集合。
2. 从节点集合中选出两个权值最小的节点,合并成一个新节点,权值为两个节点的权值之和。
3. 将新节点加入节点集合中,并删除原来的两个节点。
4. 重复步骤2和3,直到节点集合中只剩下一个节点为止,这个节点就是哈夫曼树的根节点。
下面是一个示例,假设给定的权值为[5, 9, 12, 13, 16, 45]:
首先构造出6个叶子节点:
```
5 9 12 13 16 45
/ / / / / /
A B C D E F
```
然后按照上面的步骤,合并权值最小的两个节点:
```
5 9 12 13 16 45
/ / / / /
A B C D ┌────F
│
61
│
└────E
```
继续合并权值最小的两个节点:
```
5 9 12 13 16 45
/ / / / / /
A B C ┌────D E F
│
25
│
└─────┐
│
36
│
└────C
```
继续合并权值最小的两个节点:
```
5 9 12 13 16 45
/ / / / / /
A B ┌─────┐ D E F
│ │
25 36
│ │
└─────┘
│
61
│
└────C
```
最后只剩下一个节点,它就是哈夫曼树的根节点:
```
111
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
5 106
/ \ / \
/ \ / \
/ \ / \
A B C 61
/ \
/ \
D E
```
因此,给定权值构造出的哈夫曼树就是上面的树形结构。
给定权值7,18,3,32,5,26,12,8, 构造相应的哈夫曼树。
为了构造给定权重的哈夫曼树,我们需要首先对这些权重进行排序,并按照赫夫曼编码算法步骤操作:
1. 将权重列表转换成一个二叉树结构,初始时每个权重都是一个单独的节点,根节点的权重设为0。
权值:7, 18, 3, 32, 5, 26, 12, 8
初始树形:(7), (18), (3), (32), (5), (26), (12), (8)
2. 从剩余的节点中找到两个最小的节点合并它们,形成一个新的节点,新节点的权重等于两小节点的权重之和。然后将这个新节点插入到当前树中,替换掉其中较大的那个原始节点。
3. 重复上述过程,直到只剩下一个节点,即为哈夫曼树的根。
由于这是一个手动构建的过程,我会逐步演示:
- 第一轮合并:(3) + (5) = 8,得到新的节点(8),替换掉原来的5;(7) + (8) = 15,(18)不变。
树形:(18)(15)(32)(26)(12)
- 第二轮合并:(7) + (15) = 22,(18) + (26) = 44,(32)不变。
树形:(44)(32)(22)(12)
- 第三轮合并:(22) + (12) = 34,(44)不变。
树形:(44)(34)(32)
- 最终合并:(44) + (34) = 78,(32)不变。
树形:(78)(32)
这就是根据给定权重构造的哈夫曼树。你可以看到,这个过程生成了一棵最优的二叉树,使得从根节点到每一个叶子节点的路径长度之和最小。
阅读全文