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