1. Сортируем частоты по невозрастанию;
  2. Делим на две части так, чтобы разница сумм этих частей была минимальна;
  3. Левую часть обозначим ноликом, правую единицей;
  4. Рекурсивно над ними делаем то же самое со второго пункта до тех пор, пока не дойдём до одной буквы, которую поделить пополам уже нельзя.

Построенный код не обязательно будет оптимальным, однако такой алгоритм быстрее работает на компьютерах.