news 2026/4/28 17:05:23

哈夫曼编码树

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
哈夫曼编码树
#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; }

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/28 17:03:26

终极电子书阅读解决方案:KoReader如何重新定义你的阅读体验

终极电子书阅读解决方案&#xff1a;KoReader如何重新定义你的阅读体验 【免费下载链接】koreader An ebook reader application supporting PDF, DjVu, EPUB, FB2 and many more formats, running on Cervantes, Kindle, Kobo, PocketBook and Android devices 项目地址: ht…

作者头像 李华
网站建设 2026/4/28 17:01:51

基于 Python 实现 BERT 的情感分析模型

♻️ 资源 大小&#xff1a; 2.63MB ➡️ 资源下载&#xff1a;https://download.csdn.net/download/s1t16/87425378 基于 BERT 的情感分析模型 基于 Transformer 的词向量表示 Word2vec 由词义的分布式假设出发&#xff0c;每一个单词被映射到一个唯一的稠密向量。这显然无…

作者头像 李华
网站建设 2026/4/28 17:00:52

Copilot Next 工作流配置失效的终极排查清单(含vscode-insiders日志埋点指令+copilot-telemetry解码工具),错过今天将延迟交付至少2.7人日

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Copilot Next 工作流配置失效的根因认知与交付影响建模 Copilot Next 工作流配置失效并非孤立事件&#xff0c;而是由环境上下文、策略注入时机与权限链路三重耦合导致的系统性退化。当 copilot-cli 版…

作者头像 李华
网站建设 2026/4/28 17:00:04

如何快速掌握Beyond Compare 5密钥生成:完整使用教程

如何快速掌握Beyond Compare 5密钥生成&#xff1a;完整使用教程 【免费下载链接】BCompare_Keygen Keygen for BCompare 5 项目地址: https://gitcode.com/gh_mirrors/bc/BCompare_Keygen 您是否正在使用Beyond Compare 5进行文件对比&#xff0c;却发现30天评估期结束…

作者头像 李华
网站建设 2026/4/28 16:59:56

BiliTools深度解析:基于Tauri架构的跨平台B站媒体处理工具完整指南

BiliTools深度解析&#xff1a;基于Tauri架构的跨平台B站媒体处理工具完整指南 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱&#xff0c;支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/Bili…

作者头像 李华