给定权值7、18、3、32、5、26、12、8,构造哈夫曼树
时间: 2023-07-10 18:39:22 浏览: 152
首先,将这些权值从小到大排序,得到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
```
因此,给定权值构造出的哈夫曼树就是上面的树形结构。
给定权值怎么构造哈夫曼树
构造哈夫曼树的步骤如下:
1. 对给定的权值进行从小到大的排序;
2. 取出权值最小的两个节点作为新节点的左右子节点,将它们的权值相加作为新节点的权值;
3. 将新节点插入到原来的序列中,并将原来的两个节点删除,重新排序;
4. 重复以上步骤,直到只剩下一个节点,即为所求的哈夫曼树的根节点。
在构造哈夫曼树的过程中,需要注意以下几点:
1. 权值相同的节点在排序和合并时的位置不影响哈夫曼树的形态;
2. 在排序和合并时,可以使用堆等数据结构来加快算法的执行速度;
3. 在合并节点时,需要记录节点的父节点、左子节点、右子节点的信息,可以使用指针或者其他的数据结构进行存储。
阅读全文