Алгоритмы проблемы решения серии (23 части серии)
Этот пост является частью Алгоритмы проблемы решения серии.
Описание проблемы
Это Двоичное поиск деревьев на большую сумму дерева проблема. Описание выглядит так:
Учитывая корень двоичного Поиск Дерево с различными значениями, измените его, чтобы каждый Узел
имеет новое значение, равное сумме значений исходного дерева, которое больше или равно node.val
Отказ
Как напоминание, A Двоичное дерево поиска это дерево, которое удовлетворяет этим ограничениям:
- Левый подмер у узла содержит только узлы с ключами меньше чем ключ узла.
- Правый подмер у узла содержит только узлы с ключами больше чем ключ узла.
- Обе левые, так и правые поддельники также должны быть двоичными поисковыми деревьями.
Примеры
Input: [4,1,6,0,2,5,7,null,null,null,3,null,null,null,8] Output: [30,36,21,36,35,26,15,null,null,null,33,null,null,null,8]
Решение
Мой первый подход состоял в том, чтобы пройти дерево, чтобы получить сумму всех значений узла и всех значений узла.
def sum_and_list(node, total, values): left_total = 0 right_total = 0 left_values = [] right_values = [] if node.left: [left_total, left_values] = sum_and_list(node.left, total, values) if node.right: [right_total, right_values] = sum_and_list(node.right, total, values) return [ total + left_total + node.val + right_total, values + left_values + [node.val] + right_values ]
Затем я построил хеш-карту, чтобы сопоставить значение узла до большей суммы, которую он может иметь. Итак, для приведенного выше примера это будет эта иллюстрация:
{ 0: 36, 1: 36, 2: 35, 3: 33, 4: 30, 5: 26, 6: 21, 7: 15, 8: 8, }
Алгоритм создания карт Hash довольно прост:
smaller_total = 0 mapper = {} for value in values: mapper[value] = total - smaller_total smaller_total += value
Теперь я могу использовать эту хеш-карту для изменения каждого узла дерева. Итак, я снова прохожу на дерево и обновляю значение узла со значением на карте хешей. А потом просто верните корень со всем модифицированным деревом.
def modify_helper(node, mapper): if node.left: modify_helper(node.left, mapper) if node.right: modify_helper(node.right, mapper) node.val = mapper[node.val] return node
bst_to_gst
Вызывает все функции, которые мы построили и вернули модифицированный узел.
def bst_to_gst(root): [total, values] = sum_and_list(root, 0, []) smaller_total = 0 mapper = {} for value in values: mapper[value] = total - smaller_total smaller_total += value return modify_helper(root, mapper)
Мы также могли бы построить перевернутые в заказе дерева Traversal. Таким образом, алгоритм начнет с самого правого узла, а затем перейдите на левую сторону. Мы увеличиваем ценность
Как мы проходим дерево.
value = 0 def bst_to_gst(node): if node.right: bst_to_gst(node.right) node.val = node.val + value value = node.val if node.left: bst_to_gst(node.left) return node
Ресурсы
- Обучение Python: Из грязи в князи
- Алгоритмы решения проблемы решения серии
- Стекстическая структура данных
- Структура данных очереди
- Связанный список
- Структура данных деревьев
- Узнать объектно-ориентированное программирование в Python
- Структуры данных в Python: Освещенная интервью
- Структуры данных и алгоритмы в Python
- Структуры данных для кодирования интервью в Python
- Один месяц курс Python
- Обозначение Big-O для кодирования интервью и за пределами
- Учите питон с нуля
- Узнать объектно-ориентированное программирование в Python
- Структуры данных в Python: Освещенная интервью
- Структуры данных и алгоритмы в Python
- Структуры данных для кодирования интервью в Python
- Один месяц курс Python
Алгоритмы проблемы решения серии (23 части серии)
Оригинал: “https://dev.to/teekay/algorithms-problem-solving-tree-to-greater-sum-39mp”