贪婪算法---哈夫曼树的构建及编码

哈夫曼树相关概念

  • 应用领域:压缩(提高了网络的传输效率)
  • 编码依据:最优二叉树(哈夫曼树)
  • 相关概念:
    • 节点的权(w):赋予叶子结点有意义的值
    • 节点的路径长度(L):从根节点到当前节点的个数
    • 节点的带权路径长度:w*L
    • 一棵二叉树的带权路径长度:二叉树的所有叶子节点的带权路径长度之和
    • 最优二叉树:二叉树的带权路径长度最小
  • 最优二叉树的特点:
    • 最优二叉树没有单亲节点,只有双亲节点和叶子结点
    • 若叶子节点的个数是n,那么双亲节点的个数是n-1

最优二叉树的构建总体思路

  • 以每一个节点为根节点构建的树组成森林;
  • 从森林中获取权值最小的和次小的二叉树,构成新的二叉树,再放回森林;
  • 重复第二步,直至森林中只有一棵树。

哈夫曼编码的总体思路

  • 哈夫曼树采用的是数组存储
  • 哈夫曼编码使用指针数组进行存储。数组首元素存储的是,哈夫曼编码的长度。
  • 在求哈夫曼编码时,是从叶子结点开始回溯的。即从叶子结点找到双亲节点的下标,如果此叶子结点是双亲节点的左子女,则编码为0;若是右子女,则编码为1。循环在 叶子结点的双亲为-1结束

哈夫曼树的实现

  • 用链表存储哈夫曼树

    • 存储形式:

      • 节点:
        这里写图片描述

      • 森林:用数组存储

    • 算法描述
      1.定义节点类型
//节点的结构
typedef struct node{
    struct node *left,*right;//储存指向左右节点的指针
    char word;//存储节点的表示
    int weight;//存储节点的权重 
}HuffNode;
      2.定义森林数组并初始化
    HuffNode **F;//指向动态数组的指针
    int n;//数组的长度 

    //从键盘输入数组长度 
    printf("请输入数组长度:");
    scanf("%d",&n); 

    //定义储存森林的数组
    F = (HuffNode **)malloc(n*sizeof(HuffNode*));

    //初始化森林
    for(int i = 0;i<n;i++){
        int w;//表示权重 
        char ch;//表示节点 

        //新建二叉树节点
        F[i] = (HuffNode*)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值