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

【数据结构】哈夫曼树

实现哈夫曼树构建和哈夫曼编码的生成基于顺序数组存储哈夫曼结点。#includestdio.h#includestdlib.h#defineMAX_CODE_LENGTH100#defineMY_INT_MAX9999typedefstructHuffmanNode{charcharacter;intparent;intdirection;intweight;}HuffmanNode;// 初始化哈夫曼树HuffmanNode*huffmanTreeInit(constcharcharacters[],constintweights[],intnum){if(num0){printf(Error: Invalid number of characters!\n);returnNULL;}constinttotalNodesnum*2-1;HuffmanNode*tree(HuffmanNode*)malloc(sizeof(HuffmanNode)*totalNodes);if(!tree){printf(Error: Memory allocation failed!\n);returnNULL;}// 初始化叶子节点for(inti0;inum;i){tree[i].charactercharacters[i];tree[i].weightweights[i];tree[i].parent-1;tree[i].direction-1;}// 初始化内部节点for(intinum;itotalNodes;i){tree[i].characterx;tree[i].weight-1;tree[i].parent-1;tree[i].direction-1;}returntree;}// 打印哈夫曼树voidhuffmanTreePrint(constHuffmanNode*tree,intnumLeaves){constinttotalNodesnumLeaves*2-1;printf(%-8s%-8s%-8s%-8s\n,Char,Parent,Dir,Weight);for(inti0;itotalNodes;i){printf(%-8c%-8d%-8d%-8d\n,tree[i].character,tree[i].parent,tree[i].direction,tree[i].weight);}}// 查找最小权值节点下标intfindMinWeightIndex(constHuffmanNode*tree,intcurrentSize){intminWeightMY_INT_MAX;intminIndex-1;for(inti0;icurrentSize;i){if(tree[i].parent-1tree[i].weight!-1tree[i].weightminWeight){minWeighttree[i].weight;minIndexi;}}returnminIndex;}// 构建哈夫曼树voidbuildHuffmanTree(HuffmanNode*tree,intnumLeaves){if(!tree||numLeaves1)return;intcurrentSizenumLeaves;constinttotalNodesnumLeaves*2-1;for(intposnumLeaves;postotalNodes;pos){intmin1findMinWeightIndex(tree,currentSize);if(min1-1)break;tree[min1].parentpos;tree[min1].direction0;intmin2findMinWeightIndex(tree,currentSize);if(min2-1)break;tree[min2].parentpos;tree[min2].direction1;tree[pos].weighttree[min1].weighttree[min2].weight;tree[pos].parent-1;tree[pos].direction-1;currentSize;}}// 生成并打印哈夫曼编码voidfindEncoding(constHuffmanNode*tree,chartarget,intnumLeaves){intcode[MAX_CODE_LENGTH]{0};intcodeLength0;intindex-1;for(inti0;inumLeaves;i){if(tree[i].charactertarget){indexi;break;}}if(index-1){printf(Character %c not found!\n,target);return;}intcurrentindex;while(tree[current].parent!-1){code[codeLength]tree[current].direction;currenttree[current].parent;}printf(%c encoding: ,target);for(inticodeLength-1;i0;--i){printf(%d,code[i]);}printf(\n);}// 测试函数voidhuffmanTest(){constintnumChars5;constcharchars[]{a,b,c,d,e};constintweights[]{52,8,15,23,2};printf(\n Huffman Tree Test \n);HuffmanNode*treehuffmanTreeInit(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(inti0;inumChars;i){findEncoding(tree,chars[i],numChars);}free(tree);}intmain(){huffmanTest();return0;}运行结果c-1-115d-1-123e-1-12x-1-1-1x-1-1-1x-1-1-1x-1-1-1After construction:Char Parent Dir Weight a8152b518c6115d7023e502x6010x7125x8048x-1-1100Encodings:aencoding:1bencoding:0101cencoding:011dencoding:00eencoding:0100
http://www.rkmt.cn/news/1415119.html

相关文章:

  • OpenBoard:重新定义Android输入体验的终极开源解决方案
  • 突破性OpenCore配置工具:OCAT深度解析与实战指南
  • 5步掌握原神自动化助手:提升游戏效率的终极方案
  • Linux命令:nethogs
  • 构建有记忆的智能体:用上下文关联与向量检索破解幽灵故障
  • 广告监管升级,赣州实体店AI获客的正确姿势是什么? - 优家闲谈
  • 终极指南:如何让Windows资源管理器完美显示HEIC缩略图
  • G-Helper:免费轻量级华硕笔记本性能优化神器,告别臃肿的Armoury Crate
  • MON51调试器I2C通信改造与嵌入式开发实践
  • 电路设计入门:从电压电流到光控小夜灯的全流程实践
  • YM 设计甄选|2026 武汉家装全案流程 本土优质装企收费白皮书 - 品牌评测官
  • 猫抓浏览器扩展:三步解锁网页视频音频自由下载
  • 2026年5月重庆不锈钢橱柜厂家实力排行一览:重庆厨房橱柜/重庆厨房设备供应商/重庆商用不锈钢厨房设备/优选推荐 - 优质品牌商家
  • 高效网页资源嗅探工具:5个步骤掌握猫抓浏览器扩展
  • 五分钟掌握SketchUp STL插件:3D打印工作流的最佳搭档
  • 论文写作避坑指南:书匠策AI的免费查重到底有多香?
  • AI Agent在电商大促峰值期的弹性扩展能力怎样?深度拆解2026年企业级智能自动化底座
  • 零基础企业如何低成本搭建专属 GEO 优化系统
  • 猫抓扩展:5分钟解锁网页视频音频下载的终极武器
  • AI视觉技术在奢侈品鉴定领域的应用
  • LangChain4j 的核心架构是怎样的?它的六大核心组件分别是什么?
  • 核心逻辑重构:基于多 Agent 协同(一个负责生成用例,一个负责 Review)
  • 热江手游 5 月 27 日开服公告:A1694 区 10:00 开启,官方下载 + 新手开荒全攻略
  • Uber APK Signer:Android应用签名的终极解决方案
  • 2026牛客网大厂Java面试真题+答案解析(建议直接收藏)
  • 从零打造模块化机器人:Arduino Nano与3D打印的创客实践
  • 白酒行业如何借助工作手机管理系统,杜绝飞单私单与客户流失? - 山海工作手机管理系统
  • Unreal Engine 4高级会话管理插件完整指南:如何快速实现多人游戏联机功能
  • GBase 8sWITH FUNCTION 临时函数与 RPAD/LPAD 填充函数
  • 东方科学是否存在逻辑起点:从易经到现代AI的启示