Учитывая сбалансированное дерево двоичного поиска (BST), напишите функцию isTripletPresent (), которая возвращает true, если в данном BST есть триплет с суммой, равной 0, в противном случае возвращает false. Ожидаемая сложность времени составляет O (n ^ 2), и только O (Logn) дополнительное пространство может быть использовано. Вы можете изменить данное Двоичное дерево поиска. Обратите внимание, что высота сбалансированного BST всегда O (Logn)
Например, isTripletPresent () должен возвращать true для следующего BST, поскольку существует триплет с суммой 0, триплет равен {-13, 6, 7}.
Решение Brute Force — рассмотреть каждый триплет в BST и проверить, суммируется ли сумма до нуля. Временная сложность этого решения будет O (n ^ 3).
Лучшим решением является создание вспомогательного массива и сохранение обхода Inorder для BST в массиве. Массив будет отсортирован, так как обход Instder BST всегда производит отсортированные данные. Получив обход Inorder, мы можем использовать метод 2 этого поста, чтобы найти триплет с суммой, равной 0. Это решение работает за O (n ^ 2) времени, но требует O (n) вспомогательного пространства.
Ниже приводится решение, которое работает за время O (n ^ 2) и использует дополнительное пространство O (Logn) :
1) Преобразовать данный BST в двусвязный список (DLL)
2) Теперь перебираем все узлы DLL и, если ключ узла является отрицательным, найдите в DLL пару с суммой, равной ключу текущего узла, умноженному на -1. Чтобы найти пару, мы можем использовать подход, использованный в hasArrayTwoCandidates () в методе 1 этого поста.
|
С
|
Выход:
Present
Обратите внимание, что вышеуказанное решение изменяет данный BST.
Сложность времени: Время, необходимое для преобразования BST в DLL, равно O (n), а время, необходимое для поиска триплета в DLL, равно O (n ^ 2).
Вспомогательное пространство: вспомогательное пространство требуется только для стека вызовов функций в рекурсивной функции convertBSTtoDLL (). Поскольку данное дерево сбалансировано (высота — O (Logn)), количество функций в стеке вызовов никогда не будет больше, чем O (Logn).
Мы также можем найти триплет в одно и то же время и дополнительное пространство без изменения дерева. Смотрите следующий пост. Обсуждаемый там код также может быть использован для поиска триплета.
Эта статья составлена Ашишем Анандом и рецензирована командой GeeksforGeeks. Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.
Рекомендуемые посты:
- Найти узел с минимальным значением в бинарном дереве поиска
- Найти наибольшее поддерево BST в данном двоичном дереве | Комплект 1
- Найти k-й наименьший элемент в BST (Статистика заказов в BST)
- Сортированный связанный список с сбалансированным BST
- Сортировка массива в сбалансированный BST
- Объединение двух сбалансированных бинарных поисковых деревьев
- Найти пару с заданной суммой в сбалансированном BST
- Проверьте, сбалансировано ли данное Двоичное Дерево как Красно-Черное Дерево
- Учитывая n встреч, найдите все конфликтующие встречи
- Конвертировать обычный BST в сбалансированный BST
- Найти пары с заданной суммой, такие, что парные элементы лежат в разных BST
- Найти ближайший элемент в дереве бинарного поиска
- Найти медиану BST в O (n) времени и O (1) пространстве
- Найти пару с заданной суммой в BST
- Найти ближайший элемент в бинарном дереве поиска | Эффективный космический метод
0.00 (0%) 0 votes