哈夫曼树的构建算法之找出两个最小的子树的下标

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;
}

原文地址:https://www.cnblogs.com/Blithe-Chiang/p/13832895.html