Вы на правильном пути, сравнивая количество реальных детей на каждом уровне с количеством возможных детей для этого уровня. Идеальным подходом было бы выполнить обход уровня порядка, используя очередь, и вернуть самый высокий полный уровень. Однако, поскольку вы застряли с помощью рекурсии, проблема становится в том, чтобы поддерживать счет по горизонтали между рекурсивными вызовами. Наивным решением является создание списка отсчетов для каждой высоты, а затем возврат последнего полного уровня в этом списке.
Оптимизация повторяется только в том случае, если присутствуют оба ребенка - ясно, что если ребенок отсутствует, невозможно получить полный уровень глубже в дереве, и мы можем завершить наш поиск.
public static int fullLevel(Node root) {
ArrayList<Integer> levelCounts = new ArrayList<>();
levelCount(root, 0, levelCounts);
for (int i = levelCounts.size() - 1; i >= 0; i--) {
if ((int)Math.pow(2, i) == levelCounts.get(i)) {
return i;
}
}
return -1;
}
private static void levelCount(Node root, int height, ArrayList<Integer> levelCounts) {
if (root != null) {
if (height >= levelCounts.size()) {
levelCounts.add(0);
}
levelCounts.set(height, levelCounts.get(height) + 1);
if (root.left != null && root.right != null) {
levelCount(root.left, height + 1, levelCounts);
levelCount(root.right, height + 1, levelCounts);
}
}
}
Вывод равен 2 (с нулями) для следующего дерева примеров:
____1____
/ \
_2_ __3__
/ \ / \
4 5 6 _7_ <-- tallest full level
/ \ / / \ / \
8 9 10 11 12 13 14
Попробуйте!