1)构造Hufffman树的Hufffman算法 构造Huffman树步骤: 1. 根据给定的n个权值(w1,w2,……….wn),构造n棵只有根结点的二叉树,起权值为w。 2. 在森林中选取两棵根结点权值最小和次小的树作左右子树,构造一棵新的二叉树,置新二叉树根结点权值为其左右子树根结点权值之和。 3.在森林中删除这两棵树,同时将新得到的二叉树加入森林中。 4. 重复上述两步,直到只含一棵树为止,这棵树即哈夫曼树。用c语言写代码
时间: 2024-02-11 10:03:52 浏览: 69
–Huffman树(最优二叉树)的特点-数据结构-树
好的,下面是用C语言实现构造Huffman树的算法代码:
```c
#include <stdio.h>
#include <stdlib.h>
// Huffman树节点结构体
typedef struct Node {
int weight; // 权值
struct Node *left; // 左子节点
struct Node *right; // 右子节点
} Node;
// 创建节点
Node* createNode(int weight) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->weight = weight;
newNode->left = NULL;
newNode->right = NULL;
return newNode;
}
// 交换节点
void swap(Node** a, Node** b) {
Node* temp = *a;
*a = *b;
*b = temp;
}
// 构造Huffman树
Node* buildHuffmanTree(int weights[], int n) {
Node* nodes[n]; // 节点数组
Node* root = NULL; // 根节点指针
// 初始化节点数组
for (int i = 0; i < n; i++) {
nodes[i] = createNode(weights[i]);
}
// 构造Huffman树
for (int i = 0; i < n - 1; i++) {
// 选取两棵根结点权值最小和次小的树
int min1 = i, min2 = i + 1;
if (nodes[min1]->weight > nodes[min2]->weight) {
swap(&nodes[min1], &nodes[min2]);
}
for (int j = i + 2; j < n; j++) {
if (nodes[j]->weight < nodes[min1]->weight) {
min2 = min1;
min1 = j;
} else if (nodes[j]->weight < nodes[min2]->weight) {
min2 = j;
}
}
// 构造一棵新的二叉树
Node* newNode = createNode(nodes[min1]->weight + nodes[min2]->weight);
newNode->left = nodes[min1];
newNode->right = nodes[min2];
// 在节点数组中删除这两棵树
if (min1 < min2) {
nodes[min2] = nodes[n - 1];
nodes[min1] = newNode;
} else {
nodes[min1] = nodes[n - 1];
nodes[min2] = newNode;
}
n--;
}
root = nodes[0];
free(nodes);
return root;
}
// 打印Huffman树
void printHuffmanTree(Node* root) {
if (root == NULL) {
return;
}
printf("%d\n", root->weight);
printHuffmanTree(root->left);
printHuffmanTree(root->right);
}
int main() {
int weights[] = {5, 2, 13, 6};
int n = sizeof(weights) / sizeof(weights[0]);
Node* huffmanTree = buildHuffmanTree(weights, n);
printHuffmanTree(huffmanTree);
return 0;
}
```
以上代码中,我们首先定义了一个Huffman树节点结构体,包含节点权值和左右子节点指针。然后定义了创建节点、交换节点、构造Huffman树、打印Huffman树等函数。在构造Huffman树函数中,我们首先根据权值数组创建n棵只有根结点的二叉树,然后在循环中不断选取根结点权值最小和次小的两棵树,构造一棵新的二叉树,并将这两棵树从节点数组中删除,同时将新得到的二叉树加入节点数组中。最后,节点数组中只剩下一棵树,即为Huffman树。
阅读全文