Разбор задачи: Сумма на отрезке двоичного дерева поиск

Предложенный нами код решения:

 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

Разбор решения:

  1. Базовый случай:
    • В первой строке проверяется, если узел дерева равен None, то есть если мы достигли конца дерева или поддерева. В таком случае возвращается 0, так как нет узлов для суммирования.
  2. Переменная для хранения суммы:
    • Создается переменная total, которая будет хранить сумму значений узлов, подходящих под условие задачи.
  3. Проверка текущего узла:
    • Далее проверяется, если значение текущего узла (root.val) попадает в диапазон [low, high]. Если это так, то его значение добавляется к общей сумме total.
  4. Обход левого поддерева:
    • Если значение текущего узла больше low, это означает, что в левом поддереве могут быть узлы, чьи значения тоже могут попасть в диапазон [low, high]. Следовательно, мы рекурсивно вызываем функцию rangeSumBST для левого поддерева.
    • Обратите внимание, что если значение узла меньше или равно low, то нет смысла продолжать искать в левом поддереве, так как все элементы в нем будут еще меньше и не могут попасть в диапазон.
  5. Обход правого поддерева:
    • Если значение текущего узла меньше high, то это означает, что в правом поддереве могут быть узлы, чьи значения могут попасть в диапазон [low, high]. Мы рекурсивно вызываем функцию rangeSumBST для правого поддерева.
    • Аналогично, если значение узла больше или равно high, нет смысла продолжать искать в правом поддереве, так как все элементы в нем будут еще больше и не могут попасть в диапазон.
  6. Возврат итоговой суммы:
    • После того как рекурсивные вызовы для левого и правого поддеревьев завершены, возвращается сумма всех узлов, которые находятся в заданном диапазоне [low, high].

Пример работы:

Предположим, у нас есть дерево:

        10
       /  \
      5    15
     / \     \
    3   7     18

и диапазон [7, 15].

  1. Начинаем с корня дерева, который имеет значение 10. Поскольку 10 находится в диапазоне [7, 15], добавляем 10 к сумме.
  2. Рекурсивно ищем в левом поддереве. Узел со значением 5 не попадает в диапазон, но проверяем левое поддерево, которое содержит узел со значением 3 (он тоже не входит в диапазон).
  3. Рекурсивно ищем в правом поддереве от узла 5, и находим узел со значением 7, который входит в диапазон, добавляем 7.
  4. Далее проверяем правое поддерево от корня (узел со значением 15). 15 находится в диапазоне, поэтому добавляем 15.
  5. В правом поддереве узел 18 не попадает в диапазон, поэтому дальнейший поиск там не имеет смысла.

В результате получаем сумму: 7 + 10 + 15 = 32.

 



Вы должны Войти или Зарегистрироваться чтобы оставлять комментарии