Ctrl K

Самое тяжёлое поддерево поиска

Сложная
Дан корень root двоичного дерева с целыми значениями в вершинах. Поддерево — это вершина вместе со *всеми* её потомками. Поддерево называется деревом поиска, если у каждой его вершины все значения в левой ветке строго меньше значения вершины, а все значения в правой ветке — строго больше. Найдите поддерево поиска с наибольшей суммой значений и верните эту сумму. Пустое поддерево тоже считается деревом поиска, его сумма равна 0 — поэтому ответ никогда не бывает отрицательным. Попробуйте обойти дерево за один проход.
Пример 1
root=tree_node([6, 9, 12, 7, 11, 10, 15]) → 37

Корень 6 и его левая ветка нарушают порядок, а правая ветка 12 → (10, 15) — дерево поиска с суммой 12 + 10 + 15 = 37. Это больше, чем у ветки 9 → (7, 11): 27.

Пример 2
root=tree_node([2, 1, 3, None, None, -5, 4]) → 4

Всё дерево не подходит: -5 стоит справа от 2, хотя меньше его. Из подходящих поддеревьев лучшее — одиночная вершина 4 (поддерево 3 → (-5, 4) даёт только 2).

Пример 3
root=tree_node([-3, -8, -1]) → 0

Все значения отрицательные, поэтому выгоднее взять пустое поддерево с суммой 0.

Ограничения
  • 1 ≤ число вершин ≤ 4·10⁴
  • -4·10⁴ ≤ Node.val ≤ 4·10⁴
Встречал эту задачу на настоящем собесе?
Решили0
Пробовали0
Отправок0
Принято—
Темы
Похожие задачиСамое большое поддерево поиска СредняяСамый тяжёлый путь в дереве Сложнаяk ключей рядом с целью СложнаяМинимум охранников на дереве СложнаяДругие порядки для того же дерева поиска Сложная
загружаем Python…
Вход
root=tree_node([6, 9, 12, 7, 11, 10, 15])
Ожидается
37

«Запустить» — первые 3 теста у тебя в браузере, «Отправить» — все 99 тестов на сервере, включая скрытые.