Программа курса:
Разбор задачи: Сумма на отрезке двоичного дерева поиск
Предложенный нами код решения:
def rangeSumBST(root, low, high):
if not root:
return 0
total = 0
# Если значение узла в пределах диапазона, добавляем его в сумму
if low <= root.val <= high:
total += root.val
# Если значение узла больше low, продолжаем искать в левом поддереве
if root.val > low:
total += rangeSumBST(root.left, low, high)
# Если значение узла меньше high, продолжаем искать в правом поддереве
if root.val < high:
total += rangeSumBST(root.right, low, high)
return total
Разбор решения:
- Базовый случай:
- В первой строке проверяется, если узел дерева равен
None, то есть если мы достигли конца дерева или поддерева. В таком случае возвращается 0, так как нет узлов для суммирования.
- В первой строке проверяется, если узел дерева равен
- Переменная для хранения суммы:
- Создается переменная
total, которая будет хранить сумму значений узлов, подходящих под условие задачи.
- Создается переменная
- Проверка текущего узла:
- Далее проверяется, если значение текущего узла (
root.val) попадает в диапазон [low, high]. Если это так, то его значение добавляется к общей суммеtotal.
- Далее проверяется, если значение текущего узла (
- Обход левого поддерева:
- Если значение текущего узла больше
low, это означает, что в левом поддереве могут быть узлы, чьи значения тоже могут попасть в диапазон [low, high]. Следовательно, мы рекурсивно вызываем функциюrangeSumBSTдля левого поддерева. - Обратите внимание, что если значение узла меньше или равно
low, то нет смысла продолжать искать в левом поддереве, так как все элементы в нем будут еще меньше и не могут попасть в диапазон.
- Если значение текущего узла больше
- Обход правого поддерева:
- Если значение текущего узла меньше
high, то это означает, что в правом поддереве могут быть узлы, чьи значения могут попасть в диапазон [low, high]. Мы рекурсивно вызываем функциюrangeSumBSTдля правого поддерева. - Аналогично, если значение узла больше или равно
high, нет смысла продолжать искать в правом поддереве, так как все элементы в нем будут еще больше и не могут попасть в диапазон.
- Если значение текущего узла меньше
- Возврат итоговой суммы:
- После того как рекурсивные вызовы для левого и правого поддеревьев завершены, возвращается сумма всех узлов, которые находятся в заданном диапазоне [low, high].
Пример работы:
Предположим, у нас есть дерево:
10
/ \
5 15
/ \ \
3 7 18
и диапазон [7, 15].
- Начинаем с корня дерева, который имеет значение 10. Поскольку 10 находится в диапазоне [7, 15], добавляем 10 к сумме.
- Рекурсивно ищем в левом поддереве. Узел со значением 5 не попадает в диапазон, но проверяем левое поддерево, которое содержит узел со значением 3 (он тоже не входит в диапазон).
- Рекурсивно ищем в правом поддереве от узла 5, и находим узел со значением 7, который входит в диапазон, добавляем 7.
- Далее проверяем правое поддерево от корня (узел со значением 15). 15 находится в диапазоне, поэтому добавляем 15.
- В правом поддереве узел 18 не попадает в диапазон, поэтому дальнейший поиск там не имеет смысла.
В результате получаем сумму: 7 + 10 + 15 = 32.
Вы должны Войти или Зарегистрироваться чтобы оставлять комментарии