#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct huffman {
    int weight;
    int parent, lchild, rchild;//parent放双亲再数组中的下标
}Hufnode,*HufTree;

typedef char** HuffmanCode;//动态二维数组,可看作若干个一维数组组成
void Creat_Huffmancode(HufTree HT, HuffmanCode * HC, int n)//寻找字符对应的编码,我们从叶子结点出发
//一直到根结点
{
    *HC = (HuffmanCode)malloc((n + 1) * sizeof(char*));
    char* ch = (char*)malloc(n * sizeof(char));//森林有n个根结点,临时数组ch就需要n个空间
    //(实际是n-1,但最后一个存放'\0')
    ch[n - 1] = '\0';
    for (int i = 1; i <= n; i++)//n个森林中的根结点存放在哈夫曼树数组中的1-n中
    {
        int start = n - 1;
        int c = i;
        int f = HT[i].parent;
        while (f != 0)
        {
            start--;
            if (HT[f].lchild = c)
                ch[start] = 0;
            else
                ch[start] = 1;
            c = f;
            f = HT[f].parent;
        }
        (*HC)[i] = (char*)malloc((n - start) * sizeof(char));
        strcpy((*HC)[i], &ch[start]);//将临时数组中不为0的第一个元素开始复制到
    }
}
void select(HufTree HT, int i, int& s1, int& s2)//&是传址调用,会将形参中s1的值返回给实参
{
    int min = 1;
    
    for (int n = 2; n <= i; n++)
    {
        if (HT[n].parent==0)//双亲是0表示是森林中的根结点
        {
            if ( HT[min].weight> HT[n].weight)//选取权最小的元素的下标
                min = n;
        }
    }
    s1 = min;
    min = 1;
    for (int n = 2; n <= i; n++)
    {
        if (HT[n].parent==0&&n!=s1)//不能是权第一小元素的下标
        {
            if (HT[min].weight > HT[n].weight)
                min = n;
        }
    }
    s2 = min;
}
HufTree Creat_HuffmanTree(int n)
{
    int x;
    int m = 2 * n-1;
    HufTree HT;//定义一个指针,指针就相当于数组,把指针看作数组
    HT = (HufTree)malloc((m+1)*sizeof(Hufnode));//给数组开辟空间,数组中要放m+1个元素
    //初始化
    for (int i = 1; i <= m; i++)//从下标为1到m
    {
        HT[i].parent = 0;
        HT[i].lchild = 0;
        HT[i].rchild = 0;
    }
    for (int i = 1; i <= n; i++)
    {
        scanf_s("%d", &x);
        HT[i].weight = x;
    }
    int s1, s2;
    for (int i = n - 1; i <= m; i++)
    {
        select(HT, i-1,s1,s2);//选用两小造新树
        HT[s1].parent = i;
        HT[s2].parent = i;
        HT[i].lchild = s1;
        HT[i].rchild = s2;
    }
    return HT;
}
void Unite_Huffmancode(HufTree HT, int code[],int num,int n)//解码
{
    int p=n;
    for (int i = 0; i < num; i++)
    {
        while (HT[p].lchild != 0)
        {
            if (code[i] = 0)
                p = HT[p].lchild;
            else
                p = HT[p].rchild;
        }
        printf("%d ", HT[p].weight);
        p = n;
    }
    
}
int main()
{
    HufTree HT = Creat_HuffmanTree(3);

return 0;
}

哈夫曼树的创建和哈夫曼树编码及解码相关推荐

  1. 哈夫曼树的创建和哈夫曼编码

    #include<stdio.h> #include<stdlib.h> #include<string.h> #include<limits.h> # ...

  2. 2020-10-1 //严蔚敏《数据结构》 //赫夫曼树及其应用:创建顺序赫夫曼树创建及得到赫夫曼编码

    //严蔚敏<数据结构> //赫夫曼树及其应用:创建顺序赫夫曼树创建及得到赫夫曼编码 //(从叶子结点到根逆向求每个字符的赫夫曼编码)以及(无栈非递归遍历赫夫曼树,求赫夫曼编码) //自学中 ...

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

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

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

    任务描述 本关任务:编写能对给定n个叶子结点,构建哈夫曼树,给出每个叶子结点对应编码的程序. 相关知识 哈夫曼编码和译码的基本原理 首先要构造一棵哈夫曼树.哈夫曼树的结点结构包括权值,双亲,左右孩子: ...

  5. 【赫夫曼树详解】赫夫曼树简介及java代码实现-数据结构07

    赫夫曼树(最优二叉树) 1. 简介 定义: 赫夫曼树是n个带权叶子结点构成的所有二叉树中,带权路径长度(WPL)最小的二叉树. 叶子结点的带权路径: 叶子结点权值*到根节点的路径长度(叶结点的层数) ...

  6. java哈夫曼_用 JAVA 实现哈夫曼树(Huffman Tree)

    -1. 什么是树 树是一种 有层次关系的 数据结构.它由结点组成. 图一: 树的结点由 数据域 和 子结点域 组成.数据域 作为数据的容器:子结点域 存放 子结点 的地址.一个结点是它的子结点的父结点 ...

  7. 数据结构学习记录——哈夫曼树(什么是哈夫曼树、哈夫曼树的定义、哈夫曼树的构造、哈夫曼树的特点、哈夫曼编码)

    目录 什么是哈夫曼树 哈夫曼树的定义 哈夫曼树的构造 图解操作 代码实现 代码解析 哈夫曼树的特点 哈夫曼编码 不等长编码 二叉树用于编码 哈夫曼编码实例 什么是哈夫曼树 我们先举个例子: 要将百分制 ...

  8. 树的企业应用-哈夫曼编码树-有趣的数据压缩算法

    树的企业应用-哈夫曼编码树-有趣的数据压缩算法 哈夫曼编码 描述 张三去李四家里,但 李四是一个女生,所以张三找李四去上海迪尼斯玩 - 亚历山大.张三去伊丽莎白.李四家里,但 伊丽莎白.李四是一个女生 ...

  9. 哈夫曼树的生成及哈夫曼编码

    首先构造哈夫曼树结构体,初始化哈夫曼树的四个无符号整型域,输入文本,统计各个字符的权值,然后构建哈夫曼树,从根到叶子逆向求哈夫曼树的编码. #include"stdio.h" #i ...

最新文章

  1. Repeater 嵌套 Repeater
  2. Latex学习笔记0
  3. 将win7电脑变身WiFi热点,让手机、笔记本共享上网
  4. 12月21日云栖精选夜读:阿里云总裁胡晓明:AI泡沫过后,下一站是“产业AI”...
  5. 2005年度国产空间信息系统软件测评工作圆满结束
  6. Python3提示 No module named ‘urlparse‘(解析url)
  7. 因非法扣押物资 华为向伟创力发律师函索赔数亿元
  8. 基于JAVA+SpringMVC+MYSQL的苗木销售系统
  9. 系统集成资质-信息系统项目管理师考试综合介绍
  10. viper4android使用时,ViPER4Android 目前进度 [11-21,13时16分]
  11. 2019年参加迅雷链宣讲会日记
  12. 投标文件模板 | 信息化智慧校园项目投标方案 | word版
  13. 网络视频流 -- ffmpeg 推流
  14. VDN互联网数据驱动 FOR PB
  15. 帐户当前被锁定,所以用户 sa 登录失败。系统管理员无法将该帐户解锁 解决方法
  16. 关于商业智能BI,今天只谈这五点
  17. Forecasting (一):introduction
  18. 逸鹏说道:读王阳明、曾国藩有所感
  19. linux启动mysql1820_linux下安装mysql的问题解决
  20. CSP CCF: 201903-2 二十四点 (C++)

热门文章

  1. Fluter 应用调试
  2. 在Mac上安装Hadoop HA 高可
  3. 如何通过Chrome查看网站登录 Cookie 信息
  4. 【ARTS】01_06_左耳听风-20181217~1223
  5. Qt绘制曲线图(基于qt画图QPainter)
  6. Ubuntu 常用命令
  7. 车载计算机维修,车载电脑硬件故障及检修
  8. 1024程序员狂欢节,来领当当大额优惠券
  9. 数据库事物和分布式事物
  10. 北京大学人工智能研究院落户武汉,致力于打造一流人工智能研发机构