Алгоритмы проблемы решения серии (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)
Первый помощник
Вызов в функции помощника для левой стороны дерева. Второй для правой стороны. Когда мы проходим в дедушку сейчас, нам просто нужно проверить, является ли это четным значением. Это возвращает значение узла, если оно даже. Ноль, если это не так.
Ресурсы
- Обучение Python: Из грязи в князи
- Алгоритмы решения проблемы решения серии
- Обозначение Big-O для кодирования интервью и за пределами
- Учите питон с нуля
- Узнать объектно-ориентированное программирование в Python
- Структуры данных в Python: Освещенная интервью
- Структуры данных и алгоритмы в Python
- Структуры данных для кодирования интервью в Python
- Один месяц курс Python
Алгоритмы проблемы решения серии (23 части серии)
Оригинал: “https://dev.to/teekay/algorithms-problem-solving-sum-of-nodes-3pp2”