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

Алгоритмы решения проблемы: дерево в большую сумму

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

Алгоритмы проблемы решения серии (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

Ресурсы

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

Оригинал: “https://dev.to/teekay/algorithms-problem-solving-tree-to-greater-sum-39mp”