struct Node
{
int weight;
int parent;
int lChild;
int rChild;
};
typedef struct Node NODE;
typedef NODE *HuffmanTree;
int selector(HuffmanTree HT, int n)
{
int min = -1;
bool first = true;
for (int i = 1; i <= n; i++)
{
if (HT[i].parent == 0)
{
if (first) // 只有在 min 即将第一次被赋值的时候,才会进入
{
min = i;
first = false;
}
else { // min 已经被赋值过了,进入这个分支
if (HT[i].weight < HT[min].weight)
{
min = i;
}
}
}
}
return min;
}
// 从没有选过的树里面,选择两个weight最小的。把他们的下标放在 s1和s2所在的空间
bool select(HuffmanTree HT, int *s1, int *s2, int n)
{
int min = selector(HT, n);
if (min == -1)
return false;
HT[min].parent = -1; // 设置一个值,临时地表示这个节点已经被选中了
int subMin = selector(HT, n);
if (subMin == -1)
return false;
HT[min].parent = 0; // 恢复未被选中的状态
*s1 = min; // 左边的比较小
*s2 = subMin; // 右边的大一点
return true;
}