dev写求哈夫曼树,思路是每次从权值数组里找出两个最小和第二最小的值合成新的父节点,把父节点的值放进数组后,把这两个节点的权值再改成最大,代码里的printf语句是我加上方便看各个变量怎么变化的(因为刚上手debug用的还不太熟,结果就是找了第一轮之后找出1和2,合成3并加入了数组后,然后debug到下一步数组后多了个16,不知道哪里来的,求佬解答
#include <iostream>
#include <string>
using namespace std;
#define maxint 10000000
//本程序用于实现构造最小哈夫曼数,给出n个节点,和节点的权值weight[]
//输出数组
void display(int a[]){
int i=0;
while(a[i]!='\0'){
printf("%d ",a[i]);
i++;
}
}
void select(int a[],int n,int &min1,int &min2,int &pos1,int &pos2){
//找出数组里的最小和次小
int m1=maxint;
int m2=maxint+1;
pos1=pos2=-1;
int j;
for(int i=0;i<n;i++){
if (a[i]<m1){
m2=m1;
pos2=pos1;
m1=a[i];
pos1=i;
}
else if(a[i]>=m1&&a[i]<m2){
m2=a[i];
pos2=i;
}
}
min1=m1;
min2=m2;
}
void Huffuman(int n,int weight[],int &ans){
int min1,min2;//最小和次小
int i=n;//合成的父节点从n开始存放
int j=1;
int pos1,pos2;
while(j<n){//共需n-1次合并
select(weight,i,min1,min2,pos1,pos2);
printf("第%d次合并获得最小权值: %d 和次最小权值%d: \n",j,min1,min2);
ans=ans+min1+min2;
printf("权值和为%d\n",ans);
weight[i]=weight[pos1]+weight[pos2];
i++;
printf("i=%d\n",i);
printf("----------\n");
// printf("修改值%d\n",weight[i])
weight[pos1]=weight[pos2]=maxint;
display(weight);
j++;
}
}
int main(){
int weight[]={1,2,2,5,9};
int ans;
Huffuman(5,weight,ans);
printf("%d",ans);
return 0;
}