c++哈夫曼树的构造代码
时间: 2023-07-16 08:02:41 浏览: 112
### 回答1:
哈夫曼树是一种用于数据压缩的二叉树,其构造算法主要有以下几个步骤:
1. 首先,根据给定的一组权重(即字符出现的频率),创建一组节点。每个节点包含一个字符和其对应的权重。
2. 将这组节点按照权重从小到大的顺序进行排序。
3. 从排序后的节点中选取权重最小的两个节点作为左右子节点,根节点的权重为左右子节点权重之和。将选取的两个节点从列表中移除,并将新生成的根节点插入到列表中。
4. 重复上述步骤,直到列表中只剩下一个节点,即哈夫曼树的根节点。
构造哈夫曼树的代码如下:
```python
class Node:
def __init__(self, char, weight):
self.char = char
self.weight = weight
self.left = None
self.right = None
def huffman_tree(frequencies):
nodes = [Node(char, weight) for char, weight in frequencies]
while len(nodes) > 1:
nodes.sort(key=lambda x: x.weight)
left_node = nodes.pop(0)
right_node = nodes.pop(0)
parent = Node(None, left_node.weight + right_node.weight)
parent.left = left_node
parent.right = right_node
nodes.append(parent)
return nodes[0]
# 示例使用
frequencies = [('a', 5), ('b', 9), ('c', 12), ('d', 13), ('e', 16), ('f', 45)]
tree = huffman_tree(frequencies)
```
以上是一个简单的用于构造哈夫曼树的代码示例,它通过定义`Node`类来表示节点,利用权重来构建节点列表,并通过排序、选取和合并节点来构造哈夫曼树。
### 回答2:
哈夫曼树是一种用于数据压缩的算法,它通过将频率较低的字符用较长的编码表示,而频率较高的字符用较短的编码表示,从而实现数据压缩的目的。以下是一个构造哈夫曼树的示例代码:
1. 首先,定义一个节点类,包含字符、频率和左右子节点的引用。
2. 创建一个优先队列(也可以使用堆),将所有字符及其频率作为节点插入队列,频率低的节点优先级高。
3. 从优先队列中选择频率最小的两个节点,合并为一个新节点,频率等于两个节点频率的和,将该新节点插入队列。
4. 重复步骤3,直到队列中只剩下一个节点,即为哈夫曼树的根节点。
下面是伪代码实现:
```
class Node:
def __init__(self, char, freq):
self.char = char # 字符
self.freq = freq # 频率
self.left = None # 左子节点
self.right = None # 右子节点
def construct_huffman_tree(characters):
queue = PriorityQueue()
for char, freq in characters.items():
node = Node(char, freq)
queue.put((freq, node)) # 将节点插入优先队列,按照频率排序
while queue.qsize() > 1:
min1 = queue.get()[1] # 取出队列中频率最小的节点
min2 = queue.get()[1] # 再次取出频率最小的节点
new_freq = min1.freq + min2.freq # 新节点的频率等于两个节点的频率之和
new_node = Node(None, new_freq)
new_node.left = min1
new_node.right = min2
queue.put((new_freq, new_node)) # 将新节点插入队列
root = queue.get()[1] # 获取最后剩下的根节点
return root
# 测试代码
characters = {'a': 5, 'b': 9, 'c': 12, 'd': 13, 'e': 16, 'f': 45}
huffman_tree = construct_huffman_tree(characters)
```
这段代码会根据字符及其频率构造出一个哈夫曼树,并返回根节点。在上述示例中,构造了一个包含6个字符的哈夫曼树。
### 回答3:
哈夫曼树,也叫最优二叉树,是一种常用于数据压缩的树结构。下面是一个用于构造哈夫曼树的代码实现:
1. 首先,构建一个节点的数据结构,包括权值weight和左右子节点指针。
```c
typedef struct Node {
int weight;
struct Node *left;
struct Node *right;
} Node;
```
2. 定义一个优先队列,用于存储权值较小的节点。使用最小堆实现,比较函数为节点的权值。
```c
typedef struct PriorityQueue {
int size;
int capacity;
Node **nodes;
} PriorityQueue;
```
3. 定义一个函数,用于创建一个新的节点,并初始化权值和左右子节点为空。
```c
Node* createNode(int weight) {
Node* node = (Node*)malloc(sizeof(Node));
node->weight = weight;
node->left = NULL;
node->right = NULL;
return node;
}
```
4. 定义一个函数,用于创建一个新的优先队列,并初始化大小为0,容量为初始化容量(如100)。
```c
PriorityQueue* createPriorityQueue(int capacity) {
PriorityQueue* pq = (PriorityQueue*)malloc(sizeof(PriorityQueue));
pq->size = 0;
pq->capacity = capacity;
pq->nodes = (Node**)malloc(capacity * sizeof(Node*));
return pq;
}
```
5. 定义一个函数,用于向优先队列中插入一个节点。
```c
void insert(PriorityQueue* pq, Node* node) {
int i = pq->size;
while (i > 0 && pq->nodes[(i - 1) / 2]->weight > node->weight) {
pq->nodes[i] = pq->nodes[(i - 1) / 2];
i = (i - 1) / 2;
}
pq->nodes[i] = node;
pq->size++;
}
```
6. 定义一个函数,用于从优先队列中弹出权值最小的节点。
```c
Node* pop(PriorityQueue* pq) {
Node* min = pq->nodes[0];
Node* last = pq->nodes[--pq->size];
int i = 0;
while (2 * i + 1 < pq->size) {
int j = 2 * i + 1;
if (j + 1 < pq->size && pq->nodes[j + 1]->weight < pq->nodes[j]->weight) {
j++;
}
if (last->weight <= pq->nodes[j]->weight) {
break;
}
pq->nodes[i] = pq->nodes[j];
i = j;
}
pq->nodes[i] = last;
return min;
}
```
7. 定义一个哈夫曼树的构造函数,接受一个权值数组作为输入,返回构建得到的哈夫曼树的根节点。
```c
Node* buildHuffmanTree(int weights[], int n) {
PriorityQueue* pq = createPriorityQueue(n);
for (int i = 0; i < n; i++) {
insert(pq, createNode(weights[i]));
}
while (pq->size > 1) {
Node* left = pop(pq);
Node* right = pop(pq);
Node* parent = createNode(left->weight + right->weight);
parent->left = left;
parent->right = right;
insert(pq, parent);
}
Node* root = pop(pq);
free(pq->nodes);
free(pq);
return root;
}
```
这段代码实现了哈夫曼树的构造过程。通过优先队列来维护权值较小的节点,每次从队列中选择两个最小的节点合并为一个新的节点,直到队列中只剩下一个节点,即为构建得到的哈夫曼树的根节点。
阅读全文