Прежде всего, функция height
имеет временную сложность O (n) , потому что она будет выполняться только один раз на узел (передаваемый в качестве аргумента) - рекурсивные вызовы никогда не происходят дважды длятот же узел.
Основная функция removerNodos
выполняется с временной сложностью, которая зависит от фактической арности узла и высоты дерева. Худший случай - O (n²) . Например, наихудший случай возникает в дереве, где у каждого узла есть один дочерний элемент, кроме одного: единственный лист - цепочка. Функция height
вызывается для каждого узла, поэтому общее количество посещений узла для этого конкретного формата дерева составляет 1 + 2 + 3 + ... + n = O (n²) .
Манипуляция для удаления одного узла - O (1) , когда мы рассматриваем арность как постоянную, так что это не влияет на общую сложность времени.
Некоторыепроблемы в коде
Не ваш вопрос, но есть некоторые недостатки:
-
size
не уменьшается в случае if
, т.е. при удалении рута. Когда вы вызываете .setChildren(null)
, любой последующий вызов .getChildren()
вернет пустой список, и поэтому .first()
не вернет дочерний узел, так как дочерние элементы были просто отсоединены и не будутвосстановлено больше. Поэтому лучше изменить следующее:
root.setChildren(null);
root = root.getChildren().first().element();
на:
TNode<E> hijo = root.getChildren().first().element();
root.setChildren(null);
root = hijo;
Улучшения
Код не очень эффективен. Вы получили бы лучшую временную сложность, если бы не вызывали height
для каждого узла, но фактически выполняли бы поиск в глубину (как в функции height
) и объединяли бы вычисление высоты с логикой удаления. Другими словами, используйте функцию height
в качестве функции main ;добавьте к нему параметр k и реализуйте в нем логику удаления.
Таким образом, вы не выполняете повторную DFS, включающую некоторые из одинаковых узлов(как у вас сейчас), и вам также не нужно искать индекс в родительских дочерних элементах, чтобы найти текущий узел, так как при обратном отслеживании в DFS вы будете знать точный индекс, где вы возвращались в этот узел.
Если вы реализуете его таким образом, он будет работать в O (n) .