当前位置: 首页 > news >正文

哈夫曼树代码

#include <stdio.h> #include <stdlib.h> // 修正:使用标准库头文件替换malloc.h #define MAX_CODE_LENGTH 100 // 新增:定义最大编码长度 #define INT_MAX 9999 typedef struct HuffmanNode { char character; int parent; int direction; // 0-左子树/1-右子树 int weight; } HuffmanNode; // 初始化哈夫曼树 HuffmanNode* huffmanTreeInit(const char characters[], const int weights[], int num) { if (num <= 0) { printf("Error: Invalid number of characters!\n"); return NULL; } const int totalNodes = num * 2 - 1; HuffmanNode* tree = (HuffmanNode*)malloc(sizeof(HuffmanNode) * totalNodes); if (!tree) { printf("Error: Memory allocation failed!\n"); return NULL; } // 初始化叶子节点 for (int i = 0; i < num; ++i) { tree[i] = (HuffmanNode){ .character = characters[i], .weight = weights[i], .parent = -1, .direction = -1 }; } // 初始化内部节点 for (int i = num; i < totalNodes; ++i) { tree[i] = (HuffmanNode){ .character = 'x', .weight = -1, .parent = -1, .direction = -1 }; } return tree; } // 打印哈夫曼树 void huffmanTreePrint(const HuffmanNode* tree, int numLeaves) { const int totalNodes = numLeaves * 2 - 1; printf("%-8s%-8s%-8s%-8s\n", "Char", "Parent", "Dir", "Weight"); for (int i = 0; i < totalNodes; ++i) { printf("%-8c%-8d%-8d%-8d\n", tree[i].character, tree[i].parent, tree[i].direction, tree[i].weight); } } // 查找最小权重节点(改进版) int findMinWeightIndex(const HuffmanNode* tree, int currentSize) { int minWeight = INT_MAX; int minIndex = -1; for (int i = 0; i < currentSize; ++i) { if (tree[i].parent == -1 && tree[i].weight < minWeight && tree[i].weight != -1) { minWeight = tree[i].weight; minIndex = i; } } return minIndex; } // 构建哈夫曼树(重构核心逻辑) void buildHuffmanTree(HuffmanNode* tree, int numLeaves) { if (!tree || numLeaves <= 1) return; int currentSize = numLeaves; const int totalNodes = numLeaves * 2 - 1; for (int pos = numLeaves; pos < totalNodes; ++pos) { // 查找两个最小节点 int min1 = findMinWeightIndex(tree, currentSize); if (min1 == -1) break; tree[min1].parent = pos; tree[min1].direction = 0; // 标记为左子树 int min2 = findMinWeightIndex(tree, currentSize); if (min2 == -1) break; tree[min2].parent = pos; tree[min2].direction = 1; // 标记为右子树 // 创建父节点 tree[pos].weight = tree[min1].weight + tree[min2].weight; tree[pos].parent = -1; tree[pos].direction = -1; currentSize++; } } // 查找编码(改进内存管理) void findEncoding(const HuffmanNode* tree, char target, int numLeaves) { int code[MAX_CODE_LENGTH] = {0}; int codeLength = 0; // 查找目标字符位置 int index = -1; for (int i = 0; i < numLeaves; ++i) { if (tree[i].character == target) { index = i; break; } } if (index == -1) { printf("Character '%c' not found!\n", target); return; } // 回溯生成编码 int current = index; while (tree[current].parent != -1) { code[codeLength++] = tree[current].direction; current = tree[current].parent; } // 打印结果 printf("'%c' encoding: ", target); for (int i = codeLength-1; i >= 0; --i) { printf("%d", code[i]); } printf("\n"); } // 测试用例(改进变量管理) void huffmanTest() { const int numChars = 5; const char chars[] = {'a', 'b', 'c', 'd', 'e'}; const int weights[] = {52, 8, 15, 23, 2}; printf("\n=== Huffman Tree Test ===\n"); HuffmanNode* tree = huffmanTreeInit(chars, weights, numChars); if (!tree) return; printf("\nInitial tree:\n"); huffmanTreePrint(tree, numChars); buildHuffmanTree(tree, numChars); printf("\nAfter construction:\n"); huffmanTreePrint(tree, numChars); printf("\nEncodings:\n"); for (int i = 0; i < numChars; ++i) { findEncoding(tree, chars[i], numChars); } free(tree); } int main() { huffmanTest(); return 0; }

通过画图更好理解代码

http://www.jsqmd.com/news/891920/

相关文章:

  • 3分钟革命性激活方案:告别Windows和Office激活烦恼的智能解决方案
  • 【AI工具2026权威榜单】:基于37项硬指标、127家厂商实测数据的年度终极排名(附避坑指南)
  • Java Stream Collectors.toMap实战:从基础用法到冲突解决
  • 掌握FanControl风扇曲线配置:三步告别电脑噪音与高温困扰
  • 26-cv-2040、26-cv-710、26-cv-3496、26-cv-925 NARUTO 火影忍者日本动画巨头东京电视台!NARUTO商标注册09/16/25/28/41大类
  • 用ModelSim/iverilog跑一遍HDLbits仿真题:从Testbench编写到波形调试的完整实战
  • LVGL下拉列表控件实战:从静态选项到动态事件响应的完整开发流程
  • 拉美海外仓实测评测:合规时效成本及平台适配全维度对比 - 互联网科技品牌测评
  • 从手机陀螺仪到无人机:聊聊万向锁(Gimbal Lock)那些让你设备‘晕头转向‘的瞬间
  • 从“页面未找到”到精准定位:URL、服务器与错误排查实战指南
  • 7.2 AD单通道
  • 初创团队如何利用Token Plan套餐有效控制大模型试用成本
  • 26-cv-4039、26-cv-4064 PETS ROCK潮流IP商标版权侵权!是一个将名人文化与宠物形象巧妙结合的创意艺术品牌。
  • 在Windows、Linux和macOS上免费畅玩Switch游戏:Ryujinx模拟器完整指南
  • 遥感影像解译:揭秘植被、水体、岩石、雪与土壤的独特光谱指纹
  • 从音频识别到图像处理:Conv1d和Conv2d在真实项目里到底怎么选?避坑指南来了
  • 清镇老酒回收哪家价格高,清镇老酒回收推荐 - 企业品牌
  • 如何高效管理Windows窗口:免费窗口调整工具完全指南
  • 遥感新手别纠结!实测ENVI 5.3、5.6、6.0三个免费版,教你如何混搭使用效率最高
  • FPGA多模式SHA-2硬件加速器设计:从架构到29倍GPU能效的工程实践
  • 裕丰社朱伟带队出席金融科技峰会共话行业未来发展新趋势获社员一致好评与深度认可
  • 2026年4月伞齿轮生产推荐,涡轮闸阀/涡轮蝶阀/涡轮/伞齿轮球阀/伞齿轮角阀/涡轮截止阀,伞齿轮生产口碑推荐 - 品牌推荐师
  • 用Python解码新年决心的时间序列规律
  • 哈希家族的葫芦娃七兄弟
  • Node js 服务端应用如何稳定集成 Taotoken 提供的多模型聚合能力
  • API Key集中管理功能助力企业规范内部大模型使用
  • League Akari:3个核心功能解决英雄联盟玩家的所有痛点
  • 明日方舟游戏资源库:5大技术优势解析与完整应用指南
  • 自制听觉化逻辑探针:用声音调试数字电路
  • 从‘年龄与疾病’到数据分析入门:用OpenJudge题目教你玩转计数与百分比