C Language 树和二叉树 - 哈夫曼树(十六)

本文介绍了哈夫曼树的概念,包括带权路径长度最小的二叉树特性,以及如何构建哈夫曼树。通过示例展示了哈夫曼树的构造过程,并给出了C语言实现的哈夫曼树算法。此外,还讨论了哈夫曼编码的应用,解释了如何利用哈夫曼树进行编码和解码,以优化数据存储和传输效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

话不多说,直接上车~

1.初识哈夫曼树

  • 路径:从结点A到E之间路径为:A-C-D-E , 路径长度为3
    在这里插入图片描述

  • 结点带权路径长度:例如A-E之间的路径长度为3,带权路径为WPL(权重*路径长度)=3 * 8 = 24

在这里插入图片描述
哈夫曼树的研究是什么?

在n0个带权叶子结点构成的二叉树中,带权路径长度WPL最小的二叉树成为哈夫曼树(Huffman tree)或最优二叉树。

2.创建哈夫曼树(最优二叉树构造法)
  • 带权叶子结点如下:

在这里插入图片描述

构造方法口诀:

  • 构造森林全是根

在这里插入图片描述
在6个根之中,1、5权重是最小的,所以单独选出来

  • 选用两小造新树

在这里插入图片描述
用5、6两颗小树生成新的新树

  • 删除两小添新人

在这里插入图片描述

  • 重复2、3剩单根

在这里插入图片描述
反复重复,然后完成哈夫曼树的构造

最优二叉树构成为:

在这里插入图片描述

WPL=1x5+5x5+7x4+8x3+12x2+15x1 =121

一颗有n个叶子结点的哈夫曼树共有2n-1个结点

2.哈夫曼树算法:

  1. 根据n0个带权值的二叉树,一共有2n-1个结点树,其带权值二叉树左右子树都为空。
  2. 在森林中选取两颗权值最小的树构成新树
  3. 构建2n-1个空间的数组大小用来存储所有的结点以及树
  4. 用得到的新树代替之前两小树
  5. 一直重复2 4 直到只含一棵树为止。

算法如下:

#include<stdio.h>
#include<malloc.h>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值