### 图形化输出哈弗曼树-数据结构 #### 哈弗曼树简介 哈弗曼树(Huffman Tree),又称最优二叉树,是一种带权路径长度最短的二叉树,或者说其带权路径长度是所有二叉树中最小的。哈弗曼树在数据压缩、编码等领域有着广泛的应用。 #### 核心知识点解析 **1. 哈弗曼树的构建** 哈弗曼树的构建基于贪心算法思想。首先将所有叶子节点(字符及其频率)看作是一棵单独的树(单个节点),然后不断合并两个频率最小的树,直至只剩下一棵树为止。这个过程中,每次合并的两个树的根节点的权值是这两个树根节点权值之和,新创建的根节点指向这两个树作为子树。 在给定代码中,构建哈弗曼树的过程主要体现在`gethuf()`函数中: ```cpp void gethuf() { for(int i = 1; i <= 128; i++) { if(cnt[i]) { node.ch = i; node.node = 0; node.r = 0; node.l = 0; node.num = cnt[i]; pq.push(node); } } int cc = 0; while(!pq.empty()) { x = pq.top(); pq.pop(); if(pq.empty()) break; y = pq.top(); pq.pop(); if(x.node == 0) x.node = ++cc, huf[cc] = x; if(y.node == 0) y.node = ++cc, huf[cc] = y; node.num = x.num + y.num; node.l = x.node; node.r = y.node; node.node = ++cc; huf[cc] = node; pq.push(node); } memset(hash, 0, sizeof(hash)); DFS(x.node, 0); } ``` **2. 图形化输出** 为了可视化展示哈弗曼树,代码实现了`DFS`深度优先搜索算法,通过递归方式遍历哈弗曼树,并记录每个节点的位置信息(深度),从而实现图形化的输出。 ```cpp void DFS(int u, int deep) { huf[u].deep = deep; int i; if(huf[u].l && huf[u].r) { s[deep] = '0'; DFS(huf[u].l, deep + 1); for(i = 0; i < deep; i++) { if(hash[i]) printf("|"); else printf(""); } printf("+-@\n"); if(i) hash[i] ^= 1; s[deep] = '1'; DFS(huf[u].r, deep + 1); } else { s[deep] = '\0'; for(i = 0; i < deep; i++) { if(hash[i]) printf("|"); else printf(""); } hash[i] ^= 1; printf("+-[%c](%s)\n", huf[u].ch, s); strcpy(code[huf[u].ch], s); } } ``` **3. 文件处理** 程序还涉及了对文件的操作。首先读取文本文件`dream.txt`中的内容,统计每个字符出现的次数;接着构建哈弗曼树,并计算每个字符的哈弗曼编码;最后将编码结果写入到文件`huff.txt`中。 ```cpp if(!(fp=fopen("e:\\shujujiegou\\dream.txt","r"))) { printf("Error!\n"); exit(1); } // 读取文件内容并统计字符频率 ch = getc(fp); while(ch != EOF) { cnt[ch]++; ch = getc(fp); sum++; } // 构建哈弗曼树 gethuf(); // 写入编码结果到文件 if(!(fb=fopen("e:\\shujujiegou\\huff.txt","w"))) { printf("Error!\n"); exit(1); } ``` **总结** 本篇文章通过对给定代码的分析,详细介绍了哈弗曼树的构建过程以及如何实现图形化输出哈弗曼树。此外,还探讨了如何利用C++处理文件来实现对文本内容的读取与编码结果的写入,这对于理解哈弗曼树的实际应用具有重要意义。
- woshixuweifeng2014-07-04不知道怎么运行额 = =
- honeymeier2015-09-25我也不会用,但还是感谢分享
- qq_294650632015-07-02嗯,不会用呢还,怎么运行啊,放到别的盘可以么
- 粉丝: 0
- 资源: 2
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助