首页 > 编程语言 >day13 代码随想录算法训练营 递归遍历

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

时间:2024-01-10 13:55:21浏览次数:47  
标签:遍历 helper res self 随想录 right day13 root left

题目:

我的感悟:

  • 用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

标签:遍历,helper,res,self,随想录,right,day13,root,left
From: https://www.cnblogs.com/liqi175/p/17956330

相关文章

  • Java反射遍历判断值是否属于枚举类Enum
    首先,是一个枚举类:publicenumAuditState{TO_BE_AUDIT(0,"待审核"),AUDITED(1,"已审核");privateStringmessage;privateIntegercode;AuditState(Integercode,Stringmessage){this.message......
  • HashMap的七大遍历方式
    HashMap遍历HashMap的遍历总共可以分为以下四类Iterator遍历ForEach遍历Lambda表达式遍历StreamAPI遍历Iterator迭代器遍历Iterator结合entrySet遍历//Iterator结合entry遍历HashMapMap<Integer,String>hashMap=newHashMap<>();hashMap.pu......
  • 代码随想录算法训练营第二十四天 | 回溯算法理论基础,77. 组合
    一、回溯算法理论基础学习:1.基本概念回溯法是一种搜索方式回溯的本质是穷举,是递归的副产品,即回溯算法就是递归算法回溯解决的问题都能理解成树形结构,一般是在集合中递归查找子集。集合的大小构成树的宽度(n叉树),递归的深度构成了树的深度2.回溯解决的问题(1)组合问题:N个......
  • 代码随想录 day10 栈模拟队列 队列模拟栈
    栈模拟队列大概了解一下思路自己就可以很快写出来了我们需要第二个辅助栈帮助我们把stackIn的顺序颠倒,这样FILO的栈颠倒后pop的顺序就和FIFO的队列顺序一致了大概就是这张图队列模拟栈题目要求使用两个队列模拟栈其实可以只需要一个队列就可以模拟栈的出栈顺序是最后......
  • VBA遍历控件,并在指定的位置赋值
    Sub遍历控件并赋值()DimwsAsWorksheetDimshpAsShapeDimctrlNameAsStringDimctrlValueAsIntegerSetws=ThisWorkbook.Worksheets(1)'表示第一个工作表'设置控件名和对应位置的数组DimcontrolArray()AsVariant......
  • 代码随想录算法训练营第二十天|654.最大二叉树,617.合并二叉树,700.二叉搜索树中的搜索,9
    一、654.最大二叉树题目链接:LeetCode654.最大二叉树学习:思路:前序遍历方法参数:(int[]nums,intstart,intend)返回类型:TreeNode终止条件:if(end-start==0)returnnull;if(end-start==1)returnnewTreeNode(nums[start]);单层递归逻辑:寻找数组中的最大......
  • 代码随想录 小结02 链表
    第一题移除链表元素这题比较简单使用dummyHead的方式会比较简单不需要对头指针进行单独处理但是空间开销会大一些第二题设计链表类这个没什么好说的感觉有可能一些细节会忘记需要经常复习的一块第三题反转链表这题难度不大用一个tmp指针存储一下当前指针的next......
  • 代码随想录算法训练营第十八天 | 513.找树左下角的值,112. 路径总和,113.路径总和ii,106.
    一、513.找树左下角的值题目链接:LeetCode513.找树左下角的值学习前:思路:层序遍历。采用递归和迭代两种方式递归:定义最大深度和目标值两个成员变量,方法参数是结点和当前结点的深度;返回类型为void;终止条件为结点为空;单次循环内容为判断该节点是否符合目标要求,且分别传入左子......
  • 代码随想录 小结01 数组
    数组篇一共有五个题目第一题二分查找值得注意的是,要自己想好区间的边界到底是写左闭右开还是左闭右闭根据边界不同while的条件和左右指针的移动会有差别目前我的习惯是写左闭右开还是固定一下习惯比较好第二题是实现数组类的erase()使用快慢指针可以做到在数组原地进......
  • 二叉树的四种遍历-前序、中序、后序、层序
    目录一、易懂的形象理解1、先序遍历2、中序遍历3、后序遍历4、层序遍历二、真正理解三种遍历一、易懂的形象理解其实从名字就可以很好的理解这三种遍历,我在第二点时候说,但是估计能翻到我的文的同学们之前肯定看过好多类似的了,那咱们换个思路~先用我想的一种简单易懂的形象思维......