下列选项给出的是从根分别到达两个叶结点路径上的权值序列,能属于同一棵哈夫曼树的是()

https://blog.csdn.net/u011240016/article/details/53083846

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u011240016/article/details/53083846

哈弗曼树的路径问题

普通给定一个数字或字符序列,构建哈夫曼树是非常简单易行的,只需要首先选择两个最小的元素做叶子结点,接着把它们的和与其他元素一起比较选择两个最小的元素结合在一起,直到所有元素都参与进来为止。
哈夫曼树所有的元素都在叶子结点上。

OK,构造树本身不难,但是有些问法就很有创意,比如下面这个:

    (2015.3)下列选项给出的从根分别到两个叶子结点路径上的权值序列,能属于同一棵哈夫曼树的是:D.

    A.24,10,5 和24,10,7
    B. 24,10,5和24,12,7
    C. 24,10,10和24,14,11
    D. 24,10,5和24,14,6

分析:首先根据两个叶子,以及访问到叶子的前一个结点,这个结点一定是叶子的父亲结点。再根据哈夫曼树的结点一定有兄弟,即不存在度为1的结点。因此可以知道兄弟的权值,这样,给定的一个序列就可以推出两个叶子,两个序列推出四个叶子,这样就可以根据是否选择最小的两个叶子结点组合在一起作为判据,决定这个序列是否成立了。

我们一个一个来看。
首先看D.

这里写图片描述

首先由第一个序列的10,5可以推出另一个叶子也是5,它们的父亲是10.到此为止,不能再瞎猜测其他叶子结点了。但我们知道两个叶子形成的结点有个权值为14的兄弟,但是不知道是叶子结点还是一个由叶子形成的结点,这个有待观察。

再看第二个序列,知道叶子结点6和父亲14,可以知道有个叶子兄弟是8,这个权值是14的结点有意思了,刚好可以和第一个结合成兄弟,且父亲为24,恰恰满足要求。

因此D是符合题目的树形。

再看C.

这里写图片描述

 

 

同样的分析思路再过一遍。
由第一个序列中的10,10可以得到有个叶子权值是0。第二个序列的14,11知道有个叶子是4.
OK,问题出来了,四个权值10,0,11,4是原始序列中的权值,按理说0,4最小,应该组合在一起,但是这里没有。所以是错误的树形。
当然需要明确的是,0和4不一定要组合在一起,要是序列中有1,那么0,1组合才是更小的。也就是说我们选择的是最小的,在不知道全局的情况下,局部的两个最小值最合理的是组合在一起。局部中不可能出现两个最小的分散的局面。这在哈夫曼树的构造中不可能出现的。

以上D,C从正反角度看了这种问题的解法。
同理B,A不再多说,给出图形如下:

B的树形:

这里写图片描述

如果24是第一个序列的,就不可能指到12,所以两个序列不是同一棵树的。

A也是同样的问题。
A的树形:

 

  • 188
    点赞
  • 191
    收藏
    觉得还不错? 一键收藏
  • 30
    评论
哈夫曼树是一种最优二叉树,据给定的n个结点权值,可以通过构建哈夫曼树来实现最小化带权路径长度。以下是求解这棵哈夫曼树带权路径长度的方法: 1. 对于给定的n个结点,按照权值从小到大的顺序排列。 2. 选择权值最小的两个结点作为新的子树,将它们合并为一个新的父节点,父节点的权值两个子节点的权值之和,并将这棵树添加到结点集合中。 3. 重复步骤2,直到结点集合中只剩下一个结点。 4. 计算每个结点结点路径长度,路径长度即为从该结点结点的边的权值之和。 5. 将每个结点路径长度乘以该结点权值,再将所有结点的乘积相加,即可求得哈夫曼树的带权路径长度。 例如,有4个结点权值分别为2、3、4、5,按照从小到大的顺序排列为2、3、4、5。首先选择第一个和第二个结点,合并为一个新的父节点,权值为2+3=5。然后选择第三个结点和刚合并的节点,合并为一个新的父节点,权值为4+5=9。最后将第四个结点和刚合并的节点再合并为一个新的结点权值为9+5=14。计算路径长度,节点的路径长度为0,第一次合并的节点的路径长度为1,第二次合并的节点的路径长度为2,第四个结点路径长度为3。带权路径长度为5×0+5×1+9×2+14×3=74。所以哈夫曼树的带权路径长度为74。 通过以上方法,可以求得n个有权值结点生成的哈夫曼树的带权路径长度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 30
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值