哈夫曼树c++

判定树/判别树的概念
现在假设有下面这样的一个题目在这里插入图片描述
如果根据题目构建下面这样的一棵树,那么这个树就是判定树(或判别树)
在这里插入图片描述

  • 判定树(或判别树):用于描述分类过程的二叉树

什么是哈夫曼树呢?
假设每次的输入量很大,假设现有10000个学生的成绩,其中E的学生占5%、D的学生占15%、C的学生占40%、B的学生占30%、A的学生占10%
假设以下面的方式构建一棵判定树,则1000个数据的比较次数为:10000*(15%+215%+340%+440%)=31500次

在这里插入图片描述
假设以下面的方式构建一棵判定树,则1000个数据的比较次数为:10000*(320%+280%)=22000次
在这里插入图片描述

显然,上面的两种判别树的效率是不一样,现问:有没有一种效率最高的判别树呢?其中本文讨论的哈夫曼树就是一种最优二叉树

二、一些相关术语
路径:从树中一个结点到另一个结点之间的分支构成这两个结点间的路径
结点的路径长度
结点的路径长度:两结点间路径上的分支数
例如,下面从A到B、C、D、E、F、G、H、I的路径长度分别为1、1、2、2、3、3、4、4
在这里插入图片描述
例如,下面从A到B、C、D、E、F、G、H、I的路径长度分别为1、1、2、2、2、2、3、3
在这里插入图片描述
树的路径长度(TL)
树的路径长度(TL):从树根到每一个结点的路径长度之和,记作:TL
例如,下面树的TL=0+1+1+2+2+3+3+4+4=20
在这里插入图片描述
例如,下面树的TL=0+1+1+2+2+2+2+3+3=16
在这里插入图片描述
注意:结点数目相同的二叉树中,完全二叉树是路径长度最短的二叉树
权(weight)
权(weight):将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权

结点的带权路径长度
结点的带权路径长度:从根节点到该节点之间的路径长度与该节点的权的乘积

树的带权路径长度(WPL)
树的带权路径长度(WPL):树中所有叶子结点的带权路径长度之和,记作WPL
其中WPL为:
在这里插入图片描述
演示案例
现有有4个节点a、b、c、d,权值分别为7、5、2、4。现在构建了下面的两棵二叉树
在这里插入图片描述
上面两棵二叉树的WPL分别为:
WPL(a)=72+52+22+42=36
WPL(b)=73+53+21+42=46

三、哈夫曼树
哈夫曼树:对于具有相同节点的二叉树,其中构造出来的"带权路径长度最短"的二叉树称为哈夫曼树.

演示说明
现在有4个节点a、b、c、d,各个结点的权值分别为7、5、2、4
下面构造出的二叉树WPL=72+52+22+42=36

在这里插入图片描述
下面构造出的二叉树WPL=73+53+21+42=46
在这里插入图片描述
下面构造出的二叉树WPL=71+52+23+43=35。在所有的树中其WPL最小,因此其是一棵哈夫曼树
在这里插入图片描述
下面构造出的二叉树WPL=71+52+23+43=35。在所有的树中其WPL最小,因此其是一棵哈夫曼树
总结:
满二叉树不一定是哈夫曼树
具有相同权结点的哈夫曼树不唯一
哈夫曼树中权越大的叶子离根越近,权越小的叶子离根越远

四、哈夫曼树的构建

哈夫曼树的构造方法(哈夫曼算法)

  • ①构造森林全是根:根据n个给定的权值{W1、W2、…、Wn}构成n棵二叉树的森林F={T1、T2、…、Tn},其中Ti只有一个带权为Wi的根节点
  • ②选用两小构新树:在F中选取两棵根节点的权值最小的树作为左右子树,构造一棵新的二叉树,且设置新的二叉树的根节点的权值为其左右子树上根节点的权值之和
  • ③删除两小添新人:在F中删除这两棵树,同时将新得到的二叉树加入森林中
  • ④重复②③剩余单根:重复②和③,直到森林中只有一棵树为止,这棵树即为哈夫曼树

贪心算法:构造哈夫曼树时首先选择权值小的叶子节点

https://blog.csdn.net/qq_40950183/article/details/103015895

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值