由于个人读代码时常常因为代码太长,看了上面忘记下面。思考时候要将数据结构体当成一个形式。
数据结构分为结构定义和结构操作,所以我将目录分为了三个部分
数据结构是对性质的维护和使用,那么我们就要对这种性质进行简单的描述。
他是最短路径的一种,二叉树具有最小路径长度的性质,但不全是二叉树。他通常会将大的权放在上面。
对于内容就不写了。主要是这个打图不方便。等以后有空了学一下那个软件。
下面代码的表头
#include <stdio.h>
#include <stdlib.h>
1.结构定义
//定义哈夫曼树结点
// 定义哈夫曼树结点
typedef struct TreeNode {
int weight; // 权值
struct TreeNode *left; // 左子树
struct TreeNode *right; // 右子树
} TreeNode;
//定义哈夫曼树结构体
// 定义哈夫曼树结构体
typedef struct {
int size; // 结点数
TreeNode **nodes; // 结点数组
} HuffmanTree;
2.结构操作
// 创建哈夫曼树结点
// 创建哈夫曼树结点
TreeNode *createTreeNode(int weight) {
TreeNode *node = (TreeNode *)malloc(sizeof(TreeNode));
node->weight = weight;
node->left = NULL;
node->right = NULL;
return node;
}
// 创建哈夫曼树
// 创建哈夫曼树
HuffmanTree *createHuffmanTree(int weights[], int size) {
// 创建哈夫曼树结构体
HuffmanTree *tree = (HuffmanTree *)malloc(sizeof(HuffmanTree));
tree->size = size;
tree->nodes = (TreeNode **)malloc(sizeof(TreeNode *) * size);// 将权值数组中的每个元素转换为哈夫曼树结点
for (int i = 0; i < size; i++) {
tree->nodes[i] = createTreeNode(weights[i]);
}// 构建哈夫曼树
while (tree->size > 1) {
// 找到权值最小的两个结点
int minIndex1 = -1, minIndex2 = -1;
for (int i = 0; i < tree->size; i++) {
if (minIndex1 == -1 || tree->nodes[i]->weight < tree->nodes[minIndex1]->weight) {
minIndex2 = minIndex1;
minIndex1 = i;
} else if (minIndex2 == -1 || tree->nodes[i]->weight < tree->nodes[minIndex2]->weight) {
minIndex2 = i;
}
}// 创建新结点,将权值最小的两个结点作为其左右子树
TreeNode *newNode = createTreeNode(tree->nodes[minIndex1]->weight + tree->nodes[minIndex2]->weight);
newNode->left = tree->nodes[minIndex1];
newNode->right = tree->nodes[minIndex2];// 将新结点加入结点数组中,并删除原来的两个结点
tree->nodes[minIndex1] = newNode;
tree->nodes[minIndex2] = tree->nodes[tree->size - 1];
tree->size--;
}return tree;
}
// 遍历哈夫曼树
// 遍历哈夫曼树
void traverseHuffmanTree(TreeNode *node, int depth) {
if (node == NULL) {
return;
}// 打印结点权值和深度
printf("weight: %d, depth: %d\n", node->weight, depth);// 递归遍历左右子树
traverseHuffmanTree(node->left, depth + 1);
traverseHuffmanTree(node->right, depth + 1);
}
3.主函数
int main() {
int weights[] = {5, 3, 8, 2, 9};
int size = sizeof(weights) / sizeof(int);// 创建哈夫曼树
HuffmanTree *tree = createHuffmanTree(weights, size);// 遍历哈夫曼树
traverseHuffmanTree(tree->nodes[0], 0);return 0;
}