1448. Count Good Nodes in Binary Tree
Содержание
Задача
Дано бинарное дерево. Задача подсчитать количество “хороших” узлов. Узел считается “хорошим”, если на пути от корня дерева до этого узла (включительно) не встречается узлов с большим значением.
Подсказки
“Хороший” узел в дереве — это узел, для которого все узлы на пути от корня до этого узла имеют значение не больше, чем значение этого узла.
Использовать метод обхода в глубину (DFS) для решения этой задачи.
Подход
Идея решения задачи заключается в рекурсивном обходе дерева с сохранением максимального значения на пути от корня к текущему узлу. На каждом этапе, когда мы доходим до нового узла, мы сравниваем его значение с максимальным значением на пути. Если значение узла не меньше максимального, значит, это “хороший” узел.
Этот метод обеспечивает простой и понятный способ решения задачи, хотя и может быть не самым оптимальным по времени и памяти.
- Обход в глубину (DFS): Используйте рекурсивный метод для обхода дерева.
- Текущий максимум: На каждом шаге рекурсии передавайте текущее максимальное значение на пути от корня.
- Сравнение узлов: Сравните значение текущего узла с текущим максимумом. Если значение узла больше или равно, увеличьте счетчик “хороших” узлов.
Алгоритм
Рекурсивно обходить дерево, начиная с корня.
В процессе обхода обновлять максимальное значение на пути и считать “хорошие” узлы.
Инициализируйте счетчик “хороших” узлов как 0.
Запустите рекурсивный DFS, начиная с корня дерева и передавая значение корня как текущий максимум.
В рекурсивной функции сравните значение текущего узла с переданным максимумом.
Обновите текущий максимум, если значение текущего узла больше.
Повторите шаги 2-4 для всех дочерних узлов.
Решение
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def goodNodes(root: TreeNode) -> int:
def dfs(node, cur_max):
if not node:
return 0
count = 0
if node.val >= cur_max:
count += 1
cur_max = node.val
count += dfs(node.left, cur_max)
count += dfs(node.right, cur_max)
return count
return dfs(root, root.val)