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