哈夫曼樹的構建算法之找出兩個最小的子樹的下標

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;
}
相關文章
相關標籤/搜索