Почему эта рекурсивная функция дерева работает, когда я не рекурсивно вызываю «return» внутри функции?

#python #python-3.x #recursion #tree

#python #python-3.x #рекурсия #дерево

Вопрос:

Я решаю эту проблему в Leetcode. Проблема в следующем: учитывая двоичное дерево, представьте, что вы стоите на правой стороне от него, возвращайте значения узлов, которые вы видите, упорядоченные сверху вниз. (Примечание: я не прошу помощи в логике решения этого алгоритма. Я просто спрашиваю о коде, который я написал, когда решал эту проблему.)

Мой вопрос в том, почему мой код работает, когда он написан так:

 class Solution:
    def rightSideView(self, root: TreeNode) -> List[int]:
        def helper(node, level, output):
            if level == len(output):
                output.append(node.val)
            if node.right:
                helper(node.right, level 1, output)
            if node.left:
                helper(node.left, level 1, output)
            return output
            
        if not root:
            return []
        else:
            return helper(root, 0, [])
  

но не так:

 class Solution:
    def rightSideView(self, root: TreeNode) -> List[int]:
        def helper(node, level, output):
            if level == len(output):
                output.append(node.val)
            if node.right:
                return helper(node.right, level 1, output)
            if node.left:
                return helper(node.left, level 1, output)
            return output
            
        if not root:
            return []
        else:
            return helper(root, 0, [])
  

Я в замешательстве, потому что в других рекурсивных функциях кажется, что мне всегда приходится писать return .

Комментарии:

1. Потому helper что мутирует output , который затем возвращается внешним методом. Вы не можете вернуться раньше, два if условия не являются взаимоисключающими (оба node.left и node.right могут быть истинными).

2. Вероятно, это потому, что python передает массивы как адреса вместо копий, что позволяет helper функции обновлять содержимое output без необходимости возвращать его каждый раз.

3. @jonrsharpe, ах да, теперь я это вижу. Спасибо.