【蓝桥杯】BASIC-28 Huffman树

这篇博客介绍了如何用C++实现Huffman树,通过输入一系列权重构建最小带权路径长度树。作者在过程中遇到初始化最小值设置过小导致的bug,并详细解释了构建过程和循环条件。文章探讨了如何从数组中找到最小元素并删除,以及如何合并最小节点来创建新节点,最终输出树的总费用。

 一开始有点懵,因为有可能形成的新结点是最小,也可能形成的新结点很久之后才会用到,这没地方存啊。

然后自己试探着写了个又臭又长乱七八糟的,最后还得靠度娘2333

#include <iostream>
using namespace std;

/*
Huffman树
输入格式
  输入的第一行包含一个正整数n(n<=100)。
  接下来是n个正整数,表示p0, p1, …, pn-1,每个数不超过1000。
输出格式
  输出用这些数构造Huffman树的总费用。
*/
int getmin(int a[],int &len)
{
    int r,p;
    int mmin=2000000;
    p=0;

    for(r=0;r<len;r++)//得到最小
    {
        if(a[r]<mmin)
        {
            mmin=a[r];
            p=r;
        }
    }
    //删除最小
    for(r=p;r<len;r++)
    {
        a[r]=a[r+1];
    }
    len--;

    return mmin;
}

int main()
{
    int n,a[105],mina,minb;
    int i,sum;
    sum=0;

    cin>>n;
    for(i=0;i<n;i++)
        cin>>a[i];
    while(n>1)
    {
        mina=getmin(a,n);
        sum+=mina;
        minb=getmin(a,n);
        sum+=minb;
        a[n++]=mina+minb;
    }
    cout<<sum;

    return 0;
}

总之就是建新树,最小结点要拿出来形成新结点了,那就把原结点删掉,把新结点加到最后,然后重新遍历搜索树中最小和次小的结点。

最后while循环的条件是n>1,因为每次得到最小结点(getmin函数)总会返回值而删除结点,也就是说,每个while都是删掉俩结点加上一个结点,所以循环条件是这样的,而且肯定能跳出循环。

中间还出了个小问题,就是把mmin的初始值设置成了2000,太小了,光想着单个数据不大于1000,忘了相加形成的新结点会更大,找了半天bug才找出来。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值