Рубрики
Без рубрики

Алгоритмы проблемы решения: сумма узлов

Решение алгоритмов Проблемы с TK. Теги с алгоритмами, Python, Computerscience, интервью.

Алгоритмы проблемы решения серии (23 части серии)

Этот пост является частью Алгоритмы проблемы решения серии.

описание проблемы

Это Сумма узлов с равномерно оцененным дедом проблема. Описание выглядит так:

Учитывая двоичное дерево, вернуть сумму значений узлов с четнозначенным дедушкой (дедушка узла – это родитель его родителя, если он существует.).

Если нет узлов с равномерно оцененным дедушкой, верните 0.

Примеры

[6, 7, 8, 2, 7, 1, 3, 9, null, 1, 4, null, null, null, 5]
=> 18

Представление дерева выглядит так:

Решение

Чтобы прийти с решением, я разработал некоторые правила, которые мне нужно было реализовать в алгоритме:

  • Мне нужно провести дерево
  • Узел должен иметь дедушку с четной ценностью

Для прохождения дерева простое. Мне просто нужно проверить, есть ли у него (левый | правый) ребенок и сделать рекурсивный звонок, проходящий ожидаемый ребенок.

Второе правило немного сложно. Чтобы добавить значение узла, мне нужно проверить его дедушка, но у меня нет доступа к бабусному узлу. Я мог сделать в этом случае в этом случае. Получите значение внуков, если текущий узел имеет четное значение.

Чтобы сделать эту логику, мне нужно проверить, есть ли текущий узел ребенка и внуком, прежде чем пытаться получить доступ к возможному внуку. Я попробовал эту идею в левом узле первым.

if root.left and root.left.left and root.val % 2 == 0:
        root.left.left.val

С этим у меня есть доступ к бабусноженному узлу, и я могу получить ценность внука.

Теперь, когда я могу получить ценность внука, мне нужно хранить его в переменной. Так что я инициализировал переменную левый со значением 0 получить сумму всей левой части дерева. Мне нужно было сделать левого ребенка левого ребенка и правый ребенок левого ребенка. Так в основном левые и правые внуки.

def sum_even_grandparent(node):
    left = 0

    if node.left and node.left.left and node.val % 2 == 0:
        left += node.left.left.val

    if node.left and node.left.right and node.val % 2 == 0:
        left += node.left.right.val

В то же время мне нужно было сделать ту же реализацию для левого ребенка:

if node.left:
    left += sum_even_grandparent(node.left)

Мне нужно было также сделать тот же код справа:

right = 0

if node.right and node.right.left and node.val % 2 == 0:
    right += node.right.left.val

if node.right and node.right.right and node.val % 2 == 0:
    right += node.right.right.val

if node.right:
    right += sum_even_grandparent(node.right)

Идея здесь состоит в том, чтобы проверить все токунные внуки узла и суммировать значения, если они следуют правилу.

Как мы делаем рекурсивный звонок, он пройдет все дерево.

После прохождения левой и правильной части дерева нам просто нужно получить сумму левой части дерева и правой части дерева.

А затем просто верните сумму обоих.

Вся реализация выглядит так:

def sum_even_grandparent(node):
    left = 0
    right = 0

    if node.left and node.left.left and node.val % 2 == 0:
        left += node.left.left.val

    if node.left and node.left.right and node.val % 2 == 0:
        left += node.left.right.val

    if node.left:
        left += sum_even_grandparent(node.left)

    if node.right and node.right.left and node.val % 2 == 0:
        right += node.right.left.val

    if node.right and node.right.right and node.val % 2 == 0:
        right += node.right.right.val

    if node.right:
        right += sum_even_grandparent(node.right)

    return right + left

Другое решение – пройти дедушку вниз по дереву. Мы можем построить функцию помощника для передачи этой информации:

def sum_even_grandparent(node):
    return helper(node, 1, 1)

def helper(node, parent, grandparent):
    if node is None:
        return 0

    return helper(node.left, node.val, parent) \
        + helper(node.right, node.val, parent) \
        + (node.val if grandparent % 2 == 0 else 0)

Первый помощник Вызов в функции помощника для левой стороны дерева. Второй для правой стороны. Когда мы проходим в дедушку сейчас, нам просто нужно проверить, является ли это четным значением. Это возвращает значение узла, если оно даже. Ноль, если это не так.

Ресурсы

Алгоритмы проблемы решения серии (23 части серии)

Оригинал: “https://dev.to/teekay/algorithms-problem-solving-sum-of-nodes-3pp2”