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

哈夫曼编码树

#include <stdio.h> #include <stdlib.h> #include <string.h> int w[100]; // 存放每个叶子结点的权值 char m[100]; // 存放待编码的字符 int n; // 叶子结点个数 // 哈夫曼树结点结构体 typedef struct Node { int weight; // 权值 int fa; // 父结点下标,-1表示无父结点(即当前为根) int l, r; // 左右孩子下标,-1表示无孩子 } HuffmanTree; /** * 在 tree[0] ~ tree[x] 范围内,选出两个父结点为 -1 且权值最小的结点 * s1 存放最小权值结点的下标,s2 存放次小权值结点的下标 */ void find(HuffmanTree* tree, int x, int* s1, int* s2) { int minn = 0; // 找第一个未使用的结点作为起始基准 for (int i = 0; i <= x; ++i) { if (tree[i].fa == -1) { minn = i; break; } } // 选出当前范围内权值最小的未使用结点 for (int i = 0; i <= x; ++i) { if (tree[i].fa == -1 && tree[i].weight < tree[minn].weight) { minn = i; // 更新最小值下标 } } *s1 = minn; // 最小结点下标存入 s1 // 找第二个未使用的结点(排除已选的 s1) for (int i = 0; i <= x; ++i) { if (tree[i].fa == -1 && i != (*s1)) { minn = i; break; } } // 选出除 s1 外权值最小的未使用结点 for (int i = 0; i <= x; ++i) { if (tree[i].fa == -1 && tree[i].weight < tree[minn].weight && i != (*s1)) { minn = i; } } *s2 = minn; // 次小结点下标存入 s2 } /** * 根据权值数组 w 构造哈夫曼树 * n: 叶子结点个数 * 返回包含 2*n-1 个结点的哈夫曼树数组 */ HuffmanTree* CreatHuffmanTree(int w[], int n) { int sum = 2 * n - 1; // 哈夫曼树总结点数 HuffmanTree* tree = (HuffmanTree*)malloc(sizeof(HuffmanTree) * sum); // 初始化前 n 个叶子结点(每个都是独立的根) for (int i = 0; i < n; ++i) { tree[i].weight = w[i]; tree[i].fa = -1; tree[i].l = tree[i].r = -1; } int s1, s2; // 逐次合并两个权值最小的树,产生 n-1 个内部结点 for (int i = n; i < sum; ++i) { find(tree, i - 1, &s1, &s2); // 在当前可用的树中找权值最小的两棵 tree[i].weight = tree[s1].weight + tree[s2].weight; // 新结点权值为子结点权值之和 tree[i].fa = -1; // 新结点暂时没有父结点 tree[i].l = s1; // 左孩子 tree[i].r = s2; // 右孩子 tree[s1].fa = i; // 更新左孩子的父结点 tree[s2].fa = i; // 更新右孩子的父结点 } return tree; } /** * 根据哈夫曼树生成 n 个叶子结点的编码 * 编码规则:左分支为 '1',右分支为 '0' (也可反过来,不影响压缩本质) * 返回字符串数组,每个元素是叶子结点对应的编码 */ char** Creatcode(HuffmanTree* tree, int n) { // temp 用于暂存一个叶子结点的编码(从后向前填充) char* temp = (char*)malloc(sizeof(char) * n); // codes 是二维数组,存放所有字符的编码 char** codes = (char**)malloc(sizeof(char*) * n); memset(codes, 0, sizeof(char*) * n); // 初始化为空指针 for (int i = 0; i < n; ++i) { int p = i; // 当前结点,从叶子开始 int pre = 0; // 父结点下标 int t = n - 1; // temp 数组末尾位置 temp[t] = '\0'; // 字符串结束符 pre = tree[p].fa; // 获取叶子的父结点 // 自底向上走到根结点(根结点的 fa == -1) while (pre != -1) { t--; // 腾出位置存放新编码位 if (tree[pre].l == p) { temp[t] = '1'; // 是左孩子,编码记为 1 } else { temp[t] = '0'; // 是右孩子,编码记为 0 } p = pre; // 移向父结点 pre = tree[p].fa; // 更新 pre 为更高层的父结点 } // 为编码字符串分配刚好够用的内存,并复制过去 codes[i] = (char*)malloc(sizeof(char) * (n - t)); strcpy(codes[i], &temp[t]); } free(temp); // 释放临时数组 temp = NULL; return codes; } int main() { // 输入叶子结点个数 scanf("%d", &n); getchar(); // 吸收换行符 // 输入每个叶子对应字符(连续输入,可带空格) for (int i = 0; i < n; ++i) { scanf("%c", &m[i]); } // 输入每个字符的权值(整数) for (int i = 0; i < n; ++i) { scanf("%d", &w[i]); } // 构造哈夫曼树 HuffmanTree* Tree = CreatHuffmanTree(w, n); // 生成哈夫曼编码 char** codes = Creatcode(Tree, n); // 输出每个字符及其对应编码 for (int i = 0; i < n; i++) { printf("%c:%s\n", m[i], codes[i]); } return 0; }

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

相关文章:

  • 2026年常州拖链厂家权威推荐榜:钢铝拖链塑料拖链/尼龙拖链 - 品牌策略师
  • CompressO视频图像压缩工具:如何快速将大文件变小,节省90%存储空间?
  • 终极显卡显存稳定性测试工具:memtest_vulkan 完全指南
  • [盖茨三角带] 盖茨 Super HC® XP™ Notched Premium PowerBand® 三角带
  • 沭阳百鸟朝凤:让稻草“重生”,为田园“造梦” - GrowthUME
  • 缺陷第六感训练:软件测试专家的直觉构建与精进之道
  • 2026 国产堆叠芯片封装设计软件哪个好?上海弘快 RedPKG 全流程适配 - 品牌2026
  • 使用RISC-V IDE MRS2的内置工具
  • 十年装修人转型做直播场景,温州老板都认这位实在的老陈 - GrowthUME
  • 2026年宁波黄金回收市场趋势解析与优质店铺推荐 - 福正美黄金回收
  • 如何快速掌握Beyond Compare 5密钥生成:完整使用教程
  • 深圳全居邦防水工程:深圳防水补漏经验丰富公司 - LYL仔仔
  • 成都雅致尚品文化传播:成都防爆墙租赁哪家好 - LYL仔仔
  • 别再为USB3.0接口选型纠结了!FPGA开发者实测对比StandA、StandB、MicroB三种母座
  • 别再只会用sub了!R语言里gsub的‘全局替换’技巧,帮你一键清理脏数据
  • 用Vivado FIFO IP核搞定数据位宽转换:从8位到16位,手把手教你做数据拼接与拆分
  • 济南聚鑫打胶服务:济南打胶收口公司哪家好 - LYL仔仔
  • 2026防潮箱厂家哪家好?行业技术沉淀品牌推荐 - 品牌排行榜
  • 面试官教你‘挖’出真实优缺点:别再回答‘我追求完美’了,3步定位你的技术长板与战场
  • 2026年昆明短视频代运营与AI全网推流服务商深度横评|官方直达指南 - 优质企业观察收录
  • Locale-Emulator终极指南:3步解决Windows程序乱码问题的完整教程
  • STC15单片机+NE555:一个定时器搞定频率和周期测量(附完整工程)
  • 成都波艳成笑办公家具:成都办公家具多联机食品设备回收哪家好 - LYL仔仔
  • 设备不兼容国标?国标GB28181视频监控平台EasyCVR一站式解决
  • 面试场景:互联网大厂Java求职者挑战与学习
  • 5分钟上手清音刻墨Qwen3:影视剪辑师必备的智能字幕对齐神器
  • 如何用普通摄像头实现瞳孔追踪:eyeLike开源项目完全指南
  • AI智能体安全攻防:从提示注入到工具滥用的实战评估与防御
  • HNU计算机系统期中复习(下)
  • 标准/工程化写法