day13 代码随想录算法训练营 递归遍历

题目:

我的感悟:

  • 用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更加高效,因为它避免了不必要的列表创建和合并操作。在处理大型数据时或者在内存优化十分重要的应用中,你可能会更倾向于使用这种方法。

 

资料:

https://programmercarl.com/%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E9%80%92%E5%BD%92%E9%81%8D%E5%8E%86.html#%E6%80%9D%E8%B7%AF

posted @ 2024-01-10 13:50  o蹲蹲o  阅读(2)  评论(0编辑  收藏  举报