[英]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.