簡體   English   中英

為什么這個解決方案有效? Leetcode #94

[英]Why does this solution work? Leetcode #94

python 的新手,我正在做 leetcode 問題 94,二叉樹中序遍歷。 給定二叉樹的根,返回其節點值的中序遍歷。

class Solution:
    def inorderTraversal(self, root: TreeNode) -> List[int]:
        if not root:return []
        res = []
        res+=self.inorderTraversal(root.left)
        res.append(root.val)
        res+=self.inorderTraversal(root.right)
        return res

我從https://leetcode.com/problems/binary-tree-inorder-traversal/discuss/31381/Python-recursive-and-iterative-solutions的評論部分看到了這個解決方案

但我仍然不明白為什么它有效。 res.append(root.val)之后,res 變量不會在遞歸res+=self.inorderTraversal(root.right)期間重新分配給 [] 嗎? 還是 res 變量應該是不同遞歸中的不同變量?

每個遞歸調用分配它自己的局部res變量並返回它。 最外層(第一個) res是通過組裝(附加)內部/(更深層)子問題的結果來構建的。

但是我想指出,原始程序對樹遍歷和列表創建有混合關注。 這是一個只關注遍歷的inorder實現 -

def inorder(node):
  if not node: return
  yield from inorder(node.left)
  yield node.val
  yield from inorder(node.right)

要從像inorder這樣的可迭代對象中獲取列表,我們使用list構造函數 -

list(inorder(some_tree))
# => [ ... ]

關注點分離是成功程序員使用的基本技術。 它使設計/編寫函數變得更容易,並促進代碼重用。 對於這個程序,這意味着您不僅限於創建列表; 您可以在遍歷樹時執行任何操作,例如搜索、創建新樹、打印到標准輸出、寫入文件或發出網絡請求。

s = 0
for val in inorder(some_tree):
  print(f"node value: {val}")
  s += val
print(f"tree sum: {s}")

將所有內容包裝在class中來自 Java 和 C# 等語言,但在 ZA7F5F354226B927841713963 中沒有任何好處。 另一個表明原始程序不是由流利的 Python 揚聲器編寫的指示是使用 CamelCase 而不是 snake_case -

class solution:
  def inorder_traversal(self, root):
    return list(inorder(root))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM