Кратко: в каждом элементе Entry храню yLevel (уровень строки дерева, начиная с 0), и xLevel (позиция в строке дерева, начиная с 0).
Реализовал хранение всех элементов в одной коллекции - TreeSet, как мне показалось - идеально подходит.
CompareTo() сравнивает два элемента Entry сперва по Y, затем по X.
Таким образом в моем TreeSet всегда в отсортированном виде хранятся все элементы: нижние правые всегда в конце.
Посчитал за утверждение концепцию "добавляю новые элементы всегда в самый нижний уровень слева направо".
При добавлении смотрю предпоследнюю строку дерева: если есть вакантные места - добавляю элемент туда, если нет - иду в последнюю строку дерева и добавляю слева направо.
Почитал чужие высказывания по этой задаче - подогнал под валидатор метод size() - чтобы возвращал размер не учитывая root, который инициализирую сразу после создания CustomTree. Выданные по задаче методы CheckTree() и Available...() не использую за ненадобностью в моем решении, указал только чтобы поля заполнились для валидатора.
Сам протестил решение вдоль и поперек, вроде бы все адекватно, в чем проблема - не понимаю.
...