题目:
我的感悟:
- 用helper内部函数写更好
理解难点:
代码难点:
代码示例:
- 前序
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
res = []
def helper(root):
if not root:return
res.append(root.val)
helper(root.left)
helper(root.right)
helper(root)
return res
- 中序
-
# Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right class Solution: def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]: res = [] def helper(root): if not root:return helper(root.left) res.append(root.val) # 结果放在这里,中序 helper(root.right) helper(root) return res
- 后序
-
# Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right class Solution: def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]: res = [] def helper(root): if not root:return helper(root.left) helper(root.right) res.append(root.val) # 结果放在后面,后序 helper(root) return res
通过截图:
扩展写法:
class Solution:
def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
if root is None:
return []
left = self.preorderTraversal(root.left)
right = self.preorderTraversal(root.right)
return [root.val] + left + right
在这个例子中,每次调用
preorderTraversal
函数都会返回当前节点及其左右子树的前序遍历结果的列表,然后使用+
操作符来合并列表。这种方法使代码变得简洁且易于理解,但多次的列表合并操作会导致额外的空间开销。
class Solution:
def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
res = []
def helper(root):
if not root:
return
res.append(root.val)
helper(root.left)
helper(root.right)
helper(root)
return res
内部写helper方法是:
这里,
helper
函数是一个嵌套的辅助函数,它直接在主函数定义的res
列表中添加元素。这样,就不需要每次递归都创建和合并新的列表,从而减少了空间开销。因为res
列表是在preorderTraversal
函数的作用域内定义的,helper
函数可以直接访问和修改它。总结起来,两种方法在逻辑上都是正确的,并且最终实现了相同的功能。主要区别在于它们操作列表的方式,以及这种操作对空间复杂度的影响。通常,示例代码2更加高效,因为它避免了不必要的列表创建和合并操作。在处理大型数据时或者在内存优化十分重要的应用中,你可能会更倾向于使用这种方法。