Я попытался ответить на следующий вопрос ( ссылка leetcode ):
Учитывая узел root двоичного дерева поиска, вернуть сумму значений всех узлов с значение между L и R (включительно). Бинарное дерево поиска гарантированно будет иметь уникальные значения.
Это официальное решение:
class Solution:
def rangeSumBST(self, root: TreeNode, L: int, R: int) -> int:
def dfs(node):
if node:
if L <= node.val <= R:
self.total += node.val
if L <= node.val:
dfs(node.left)
if node.val <= R:
dfs(node.right)
self.total = 0
dfs(root)
return self.total
solution = Solution()
print(solution.rangeSumBST(root, L, R))
Работает, как и ожидалось, например, для следующего ввода: root = [10,5,15,3,7,null,18], L = 7, R = 15
, вывод 32
. Но почему возникает ошибка, если я пишу ее как простую функцию без оператора класса?
def rangeSumBST(root: TreeNode, L: int, R: int) -> int:
def dfs(node):
if node:
if L <= node.val <= R:
total += node.val
if L <= node.val:
dfs(node.left)
if node.val <= R:
dfs(node.right)
total = 0
dfs(root)
return total
print(rangeSumBST(root, L, R))
Это сообщение об ошибке: Local variable 'total' defined in enclosing scope on line 75 referenced before assignment... (pyflakes E)
Второй фрагмент кода выглядит практически идентично, но я могу Не скажу, почему объектно-ориентированный стиль решения работает, пока я получаю сообщение об ошибке, записав его в виде простой функции. Очевидно, что с переменной 'total' что-то не так, но не должна ли переменная, определенная вне области функции, быть также доступной внутри области функции?