哈夫曼树的构造中遇到了以下问题,有没有人帮看一下
#include
#include
#define MAX 200
typedef struct htnode
{
char data;
int weight;
int parent, lch, rch;
}htnode, *httree;
void creattree(htnode *ht, int n)
{
int lnode, rnode;
double min1, min2;
for(int i = 0; i < 2*n-1; i++)
{
ht[i].parent = ht[i].lch = ht[i].rch = -1;
}
for(int i = n; i < 2*n-1; i++)
{
min1 = min2 = 99999;
lnode = rnode = -1;
for(int k = 0; k <= i-1; k++)
{
if(ht[k].parent == -1)
{
if(ht[k].weight < min1)
{
min2 = min1;
rnode = lnode;
min1 = ht[k].weight;
lnode = k;
}
else if(ht[k].weight < min2)
{
min2 = ht[k].weight;
rnode = k;
}
}
}
ht[i].weight = ht[lnode].weight + ht[rnode].weight;
ht[lnode].parent = i;
ht[rnode].parent = i;
ht[i].lch = lnode;
ht[i].rch = rnode;
}
}
int main(void)
{
int n;
htnode h[MAX];
printf("输入哈夫曼树的结点个数:");
scanf("%d", &n);
printf("输入每个结点的权重:");
for(int i = 0; i < n; i++)
scanf("%d ", h[i].weight);
creattree(h, n);
printf("哈夫曼树的权重排序为:");
for(int i = n; i < 2*n-1; i++)
printf("%d ", h[i].weight);
return 0;
}
1.在函数 creattree 中,你使用了 double 类型的 min1 和 min2 来保存最小的两个节点的权值。但是,在结构体 htnode 中,你定义的权值是 int 类型的,所以使用 double 类型的 min1 和 min2 可能会导致精度问题。你可以改为使用 int 类型的 min1 和 min2。
2.在读取输入的结点权值时,你使用的是 scanf("%d ", h[i].weight)。这里的空格可能会导致读取不到权值,你可以改为 scanf("%d", &h[i].weight)。
3.在循环中找最小的两个节点时,你没有将 min1 和 min2 初始化为正无穷大。这可能会导致找不到正确的节点。你可以在定义 min1 和 min2 时将其设置为正无穷大,例如:
double min1 = INFINITY, min2 = INFINITY;
另外,我注意到你在主函数中使用了 printf("输入每个结点的权重:"); 语句,但没有提示用户输入权值。你可以在提示用户输入之后,使用 scanf 读取权值。例如:
printf("输入每个结点的权重:");
for (int i = 0; i < n; i++) {
printf("第 %d 个结点的权值:", i + 1);
scanf("%d", &h[i].weight);
}