有两种方案
说明: s1,s2是用来保存两个最小权值的节点的下标;
ht是哈夫曼树,Huffmantree是结构体类型,有四个域;
i是已经有了权值的节点数。
该函数是根据清华大学出版社的数据结构书来写的。
void select (Huffmantree ht, int i,int*s1,int*s2)//有了孩子的节点就不能再用了
{
int m, n,min,j,k = 1;
for (n = 1; n <= 2; n++)//连续找两个最小权值的数
{
for (m = 1; m <= i; m++)
{
//第一种方案:parent ==0
if (ht[m].parent == 0 && *s1 != m)
{
min = ht[m].weight;
k = m;
j = m;
while (1)
{
if (j < i)
j++;
if (ht[j].parent == 0 && min > ht[j].weight && *s1 != j)
{
min = ht[j].weight;
k = j;
}
if (j == i)
break;
}
}
else
continue;
//一下为第二种方案parent!=0
//
//if (ht[m].parent != 0 ||* s1 == m)
// continue;
//min = ht[m].weight;//擂台法
//k = m;
//j = m;//保存下标
//while (1)
//{
// if(j<i)//只针对最后一个为最小时,避免越界,出现访问错误
// j++;
// if (ht[j].parent != 0 || *s1 == j)//不找parent有值或第一次已经找过的
// {
// if (j == i)//只针对最后一个,避免越界,出现访问错误
// break;
// continue;
// }
// if (min > ht[j].weight)//min比较大时交换
// {
// min = ht[j].weight;//交换
// k = j;//保存下标
// }
// if (j == i)//找完后的结束条件
// break;
//}
if (n == 1)
*s1 = k;//保存第一个下标
else
*s2 = k;
break;
}
}
}