Значение поддерева зависит только от узлов ниже, чем в дереве, поэтому нет абсолютно никакой причины иметь в коде восходящий внешний l oop.
Очень простой нисходящий Рекурсивный подход будет следующим:
def calc_subtree_value(node):
val = node.value
for child in node.children: # we don't need a base case, this forks for leaf nodes too
calc_subtree_value(child)
if child.subtree_value > val:
val = child.subtree_value
node.subtree_value = val
Это займет O (N) время, где N - количество узлов в поддереве, так как оно посещает каждый из них ровно один раз. Как я отмечаю в комментарии, нам не нужен явный базовый случай, потому что l oop над дочерними элементами делает то, что мы хотим (ничего), если нет дочерних элементов для проверки больших значений поддерева.