任务描述

本关任务:编写能对给定n个叶子结点,构建哈夫曼树,给出每个叶子结点对应编码的程序。

相关知识

哈夫曼编码和译码的基本原理

  1. 首先要构造一棵哈夫曼树。哈夫曼树的结点结构包括权值,双亲,左右孩子;假如由n个字符来构造一棵哈夫曼树,则共有结点2n-1个;在构造前,先初始化,初始化操作是把双亲,左右孩子的下标值都赋为0;然后依次输入每个结点的权值。

  2. 第二步是通过n-1次循环,每次先找输入的权值中最小的两个结点,把这两个结点的权值相加赋给一个新结点,并且这个新结点的左孩子是权值最小的结点,右孩子是权值第二小的结点;鉴于上述找到的结点都是双亲为0的结点,为了下次能正确寻找到剩下结点中权值最小的两个结点,每次循环要把找的权值最小的两个结点的双亲赋值不为0i)。就这样通过n-1循环下、操作,创建了一棵哈夫曼树,其中,前n个结点是叶子(输入的字符结点)后n-1个是度为2的结点。

  3. 编码的思想是逆序编码,从叶子结点出发,向上回溯,如果该结点是回溯到上一个结点的左孩子,则在记录编码的数组里存“0”,否则存“1”,注意是倒着存;直到遇到根结点(结点双亲为0),每一次循环编码到根结点,把编码存在编码表中,然后开始编码下一个字符(叶子)

测试说明

平台会对你编写的代码进行测试:

测试输入:5 2 7 4 5 19

预期输出:(对哈夫曼树按中序遍历输出对应叶子的哈夫曼编码)


  1. 7 00
  2. 5 010
  3. 2 0110
  4. 4 0111
  5. 19 1
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
# include<malloc.h>
#include <iostream>
using namespace std;
#define max 1000;
struct HtNode {int ww;//结点的权值int parent, lch, rch;char codes[10];//存放哈夫曼编码
};
struct HtTree {int m;//叶子结点的个数int root;//哈夫曼树根在数组的下标struct HtNode ht[1000];//存放2m-1个节点的数组
};
typedef struct HtTree* HtTreee;HtTreee creathuffman(int m, int* w)//创建哈弗曼树
{int num = 2 * m - 1;HtTreee huf;int i, j, x1, x2, m1, m2;huf = (HtTreee)malloc(sizeof(struct HtTree));;//huf->ht = (struct HtNode*)malloc(sizeof(struct HtNode) * num);//分配空间for (i = 0; i < num; i++) {huf->ht[i].lch = huf->ht[i].parent = huf->ht[i].rch = -1;if (i < m) {huf->ht[i].ww = w[i];}else {huf->ht[i].ww = -1;}}//初始化哈弗曼树for (i = 0; i < m-1; i++) {m1 = m2 = max;x1 = x2 = -1;for (j = 0; j < m + i; j++) {//寻找两个最小权的无父节点的结点if (huf->ht[j].ww < m1 && huf->ht[j].parent == -1) {//x1存放最小的下标m2 = m1; x2 = x1;m1 = huf->ht[j].ww;x1 = j;}else if(huf->ht[j].ww < m2 && huf->ht[j].parent == -1) {//x1存放次小的下标m2 = huf->ht[j].ww; x2 = j;}}huf->ht[x1].parent = huf->ht[x2].parent = m + i;huf->ht[m + i].ww = m1 + m2;huf->ht[m + i].lch = x1; huf->ht[m + i].rch = x2;//默认右大左小}huf->root = 2 * m - 2;return huf;
}void huffmancodes(HtTreee huf,int n) {char* temp;temp = new char[n];temp[n - 1] = '\0';int start, pos, parent;for (int i = 0; i < n; i++) {start = n - 1;pos = i;parent = huf->ht[i].parent;while (parent != -1) {if (huf->ht[parent].lch == pos) {temp[--start] = '0';}else{temp[--start] = '1';}pos = parent;parent = huf->ht[parent].parent;}strcpy(&huf->ht[i].codes[0], &temp[start]);}delete temp;}void inOrderhuffman(HtTreee huf)
{    int i = huf->root;if (huf->ht[i].lch==-1) {cout << huf->ht[i].ww<<" " << huf->ht[i].codes << endl;return;}huf->root = huf->ht[i].lch;inOrderhuffman(huf);huf->root = huf->ht[i].rch;inOrderhuffman(huf);}
int main() {int m,ww;cin >> m;//输入叶子结点个数HtTreee huf;int w[100];//存放权值for (int i = 0; i < m; i++) {cin >> ww;w[i] = ww;}huf = creathuffman(m,w);huffmancodes(huf, m);inOrderhuffman(huf);
}

c语言实现哈夫曼树的创建与中序遍历以及哈夫曼编码(附详细代码)相关推荐

  1. 二叉树 中序遍历 python_LeetCode 105 树 从前序与中序遍历序列构造二叉树(Medium)

    17(105) 从前序与中序遍历序列构造二叉树(Medium) 描述 根据一棵树的前序遍历与中序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 示例 例如,给出前序遍历 preorder = ...

  2. java语言 写一算法求其叶子数目_数据结构(Java)在线作业1. 设n为哈夫曼树的叶子结点数目,则该哈夫曼树共有( )个结点。A. n+1B. 2n-1...

    数据结构(Java)在线作业1. 设n为哈夫曼树的叶子结点数目,则该哈夫曼树共有( )个结点.A. n+1B. 2n-1 数据结构(Java)在线作业 1. 设n为哈夫曼树的叶子结点数目,则该哈夫曼树 ...

  3. 赫夫曼树的创建(思路分析)

    赫夫曼树的创建(思路分析) 构成赫夫曼树的步骤: 从小到大进行排序,将有一个数据(每一个数据其实就是一个节点)看做是一颗最简单的二叉树 取出根节点权值最小的两颗二叉树(其实就是取出权值最小的两个结点) ...

  4. 【哈夫曼树】创建哈夫曼树

    文章目录 基础概念: 什么是路径? 什么是路径长度? 什么是[结点]的带权路径长度? 什么是[树]的带权路径长度? 如何构建一棵哈夫曼树? 1.构建森林: 设计哈夫曼树 优先级队列:(priority ...

  5. 赫夫曼树的创建,赫夫曼编码的原理及使用

    目录 一.创建赫夫曼树 代码实现:最后返回值式创建好的赫夫曼树的顶点 对int[] arr = {13, 7, 8, 3, 29, 6, 1};进行赫夫曼树,我们创建好的node数组依次是这样变化 创 ...

  6. C语言学习笔记——根据二叉树的后序和中序遍历序列,求这棵树的先序和层次遍历序列

    先根据二叉树的后序和中序遍历序列,用递归的方法创建出这棵树,然后用的自定义栈的先序和层次方法遍历. 输入:  7 2 3 1 5 7 6 4                      1 2 3 4 ...

  7. 根据 中序遍历 和 后序遍历构造树(Presentation)(C++)

    好不容易又到周五了,周末终于可以休息休息了.写这一篇随笔只是心血来潮,下午问了一位朋友PAT考的如何,顺便看一下他考的试题,里面有最后一道题,是关于给出中序遍历和后序遍历然后求一个层次遍历.等等,我找 ...

  8. pat根据中序遍历和先序遍历_[leetcode/lintcode 题解] 前序遍历和中序遍历树构造二叉树...

    [题目描述] 根据前序遍历和中序遍历树构造二叉树. 在线评测地址: 九章算法 - 帮助更多中国人找到好工作,硅谷顶尖IT企业工程师实时在线授课为你传授面试技巧​www.jiuzhang.com [样例 ...

  9. c++ 删除二叉树的子树_数据结构—树|二叉树|前序遍历、中序遍历、后序遍历【图解实现】...

    点击蓝字关注我们 AI研习图书馆,发现不一样的精彩世界 数据 结构 二叉树的遍历 一.树 在谈二叉树的知识点之前,我们首先来看一下树和图的基本概念.树:不包含回路的连通无向图,树是一种简单的非线性结构 ...

最新文章

  1. 仅需10分钟:开启你的机器学习之路
  2. 基于 abp vNext 和 .NET Core 开发博客项目 - 使用Redis缓存数据
  3. python各种数据类型的常用方法_Python之数据类型的常用方法
  4. 临颖一高2021高考成绩查询,临颍一高举办2021年决战高考百日冲刺誓师大会
  5. 权限设计(资源权限和数据权限)
  6. sql2008 评估期过期解决办法
  7. H.264 NAL层解析
  8. react-hooks学习笔记
  9. java 图形编辑器_SVGX矢量化图形编辑器,100%JAVA实现的矢量化图形编辑器
  10. python求x的y次方logn_次方计算器
  11. SPSS26中文免费版下载和安装教程
  12. 网络安全工程师面试分享
  13. BIOS设置中的启动引导模式以及SATA的三种模式
  14. C# 通过调用Microsoft Office编辑Word文件
  15. 程序员从互联网跳央企,晒一天工作和收入
  16. CSS控制页面展开/关闭
  17. 微信小程序Unhandled promise rejection TypeError
  18. Android Camera使用OpenGL ES 2.0和GLSurfaceView对预览进行实时二次处理(黑白滤镜)
  19. 15个很有趣的开源项目推荐
  20. CPU、操作系统的32位与64位

热门文章

  1. Halium 9 尝鲜 -- 在小米平板4上的移植 (七)
  2. 敏涵控股董事长刘敏——不一样的巾帼慈善企业家
  3. 20191219 门面设计模式
  4. Content Negotation在Nancy的实现和使用
  5. 基于Python的车牌识别系统的实现
  6. gc2000导出丝印和坐标_GC坐标的导出与引入
  7. 技术报告 | 罗汉堂:理解大数据:数字时代的数据和隐私2021.pdf(附下载链接)
  8. 阐述游戏AI设计的两个禁忌及解决方法
  9. 更改DDWRT的默认配置基本步骤
  10. 漫谈程序员(十五)——应届毕业生上海市落户政策解读