Простой алгоритм O (nlog (n)) среднего размера возникает из-за атаки этой проблемы методом разделения и покоя.
input_level = 0
, output_level=0
, left=0
, right=n-1
.
В каждом из рекурсивных шагов, количество элементов со значением input_level+1
во входном массиве A
в диапазоне [left
, right
]. Это дети текущего узла. Если таких элементов нет, напечатайте output_level
и вернитесь. Если есть только один такой элемент, «удалите» текущий узел (т. Е. Не печатайте его), увеличьте left
на 1 и вызовите функцию рекурсивно. Если есть два или более таких элемента, напечатайте output_level
, увеличьте output_level
на 1 и примените функцию рекурсивно к каждому из интервалов, разделенных дочерними элементами. Всегда Увеличение input_level
при выполнении рекурсивного вызова.
Для примера ввода A=[0, 1, 2, 3, 3, 1, 2, 3]
, первый алгоритм найдет элементы со значением 1, на индексы 1 и 5. Затем было бы напечатать 0, увеличить output_level
и current_level
на 1, и называют себя рекурсивно два раза: на диапазонах [1 , 4] и [5, 7].
Сложность этого вопроса заключается в O (n) в худшем случае (для вырожденного дерева, которое фактически является списком), но O (nlog (n)) в среднем как случайный n- ary tree имеет высоту O (log (n)).
Что вы пробовали? Подсказка: можете ли вы воссоздать дерево из этой информации? –
Извините, я не понял, что вы имели в виду. Из выходного массива невозможно создать дерево ввода, но это не моя цель. Не могли бы вы объяснить больше, пожалуйста? – guezara
Пример не соответствует вашему описанию. Вы удаляете обоих детей из самого левого узла. –