
一开始有点懵,因为有可能形成的新结点是最小,也可能形成的新结点很久之后才会用到,这没地方存啊。
然后自己试探着写了个又臭又长乱七八糟的,最后还得靠度娘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才找出来。

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

被折叠的 条评论
为什么被折叠?



