- 博客(19)
- 收藏
- 关注
原创 二叉树bst
下面我们详细解释一下为什么后序遍历位置可以实现这种高效的剪枝 在整个过程中,我们每次处理节点时,都能确保它的左右子树已经处理完毕,这样我们可以根据子树的结果决定是否剪掉当前节点。这种遍历方式意味着我们在处理一个节点时,已经处理并得到它的左右子树的结果。“自底向上”的处理方式指的是在后序遍历过程中,我们在处理一个节点时,已经处理并完成了其所有子节点的操作。这种自底向上的处理方式确保了我们在处理每个节点时,已经拥有了其左右子树的所有信息,可以直接进行计算,而不需要重复访问子树,从而提高了效率。
2024-08-07 22:14:21
546
原创 二叉树刷题,bfs刷题
实例方法使用self来访问和修改实例属性和方法。类方法使用cls来访问类属性和方法。静态方法不需要self或cls参数,因为它们不访问类或实例的任何属性或方法。访问实例方法需要使用self,这并不是类方法的特性,而是实例方法的特性。类方法和静态方法不使用self,类方法使用cls,静态方法不使用任何特殊的类或实例引用实例方法: 实例方法可以访问实例属性和类属性。它们主要用于操作实例数据。python复制代码class MyClass:类方法: 类方法只能访问类属性,不能直接访问实例属性。
2024-08-06 23:26:22
1004
原创 二叉树遍历分解问题+遍历的思路
本篇所有题目先用分解问题思路解决,再用遍历思路解决**方法一,分解问题的思路. 分解成左子树是否能满足target - root.val 或者右子树是否能满足target - root.val 再详细考虑base case **在递归函数中,基线条件(base case)是用于停止递归的条件,这里有两个base caseFalseTrue。
2024-08-05 17:32:41
516
原创 二叉树递归解决问题刷题 (一)
遇到和深度相关的题目,可以用dfs递归遍历深度获取bfs结果来做513. 找树左下角的值如何找二叉树最底层最左边节点的值呢,就是dfs遍历深度,来获取,最后一层的第一个元素就是。分解问题的思路解决二叉树回顾确定问题的性质:首先,你需要明确你要解决的问题是什么。例如,是要查找某个值,还是要遍历整棵树,或者是计算某个特定属性(如深度或节点数)?找到基本情况(Base Case):这是递归的停止条件。对于二叉树来说,基本情况通常是树为空(即节点为 )。在这种情况下,你可以直接返回结果(例如,对于查找值的问题,
2024-08-05 15:01:21
1158
原创 二叉树递归遍历解决问题刷题 (二)
1.如果让你在二叉树的「树枝」上做文章,那么用遍历的思维模式解题是比较自然的想法 可以是求和问题也可以是路径问题,路径问题可以理解为回溯两次,在叶子结点那里的回溯,是把记录的一个叶子节点删除某些节点符合一些特质,找到这些符合特质的节点,用递归遍历的思想来写左叶子就是某些结点在这道题目中,我们需要计算二叉树中所有左叶子节点的和。因为我们只是需要遍历整棵树,并累加所有左叶子节点的值,而不需要修改或恢复树的状态,所以不需要回溯。
2024-08-04 22:30:32
907
原创 二叉树递归遍历解决问题刷题 (一)
在遍历完左子树和右子树后,需要将当前节点从路径中移除。这是为了确保在回溯到上一个节点时,路径是正确的。例如,当从2回溯到1时,路径应该从'12'变为'1',而不是'12'。python复制代码这行代码在每次递归调用结束后,移除路径中的最后一个字符,保证路径能够正确回溯到父节点。总结来说,回溯时移除路径中的最后一个字符是必要的,以确保路径在遍历和回溯过程中始终正确。搞清楚回溯几次还是很有必要的,草稿本上理一理。反正最多也就是两个地方回溯。# 遍历一遍二叉树就能出结果# 二叉树遍历函数。
2024-08-03 23:21:42
1232
原创 二叉树(三),半知半解救
这种“分解问题”的思路,即递归思想,核心在于对递归函数的定义。通过对函数的定义,解释代码的逻辑,并验证其正确性。来计算结果,而用分解问题思路解题时函数名根据该函数具体功能而定,而且一般会有返回值,返回值是子问题的计算结果。「分解问题」这一模式,关键在于明确递归函数的定义,然后利用这个定义,来构造函数,而具体如何完成的可能比较模糊。,而在 [动态规划核心框架] 中给出的函数签名是带有返回值的。「遍历」这一思维模式,只要运用二叉树的递归遍历框架即可。中给出的函数签名一般也是没有返回值的。二、用分解问题的方法。
2024-07-24 20:03:26
359
原创 动态规划定义
通俗地说,动态规划就是通过记住已经解决的子问题的答案,从而避免重复计算,从而加速问题的解决。动态规划问题本质上是通过聪明地穷举来优化问题的求解过程。通过列出状态转移方程和使用空间换时间的思路,你可以有效地解决许多复杂问题。动态规划的核心思想就是把一个大问题分解成许多小问题,通过记录小问题的解来避免重复计算,从而高效地解决大问题。动态规划通过“记住过去”的方式,让计算机能更聪明地穷举,从而高效解决问题。穷举所有可能性:通过状态转移方程描述问题的递归关系。定义状态:确定问题的状态和状态变量。
2024-07-22 20:20:46
522
原创 链表(二) 找链表倒数第k个结点(详细文字推导) + 链表环(详细通俗思路)
三、综上两点,思路清晰,让第一个结点走k步,走到第k步的时候设置第二个结点, 当第一个结点走到null,这时候第2个结点走了n - k 步,也就是走到了整数第n - k + 1个 结点,也就是找到了倒数第k个结点。解体思路:快慢指针都从起始点开始走,假设走了k步相遇,也就是慢指针走的距离是k,快指针走的距离是2k假设 慢指针当前位置,也就是快慢指针相遇位置距离结点起点距离为m, 那么抓住关键点。当链表长度为奇数时候,假设n = 5 走到中间结点需要走2步,也就是整数第3个,此时快指针在最后一个结点。
2024-07-21 23:54:26
986
原创 链表概念的理解
导入了heapq模块,它是Python标准库的一部分,提供了堆队列算法的实现,也就是我们常说的优先队列。在 Python 中,对象变量实际上是对象的引用或指针。当你创建一个对象并将其赋值给一个变量时,这个变量实际上存储的是对象的内存地址。通过这个变量,你可以访问和操作对象的属性和方法。:在 Python 中,变量存储的是对象的引用或内存地址,通过这些引用我们可以访问和操作对象。:在Python中,赋值操作将对象的引用(内存地址)赋给变量,而不是对象本身。的属性和方法,因为它们引用的是同一个对象。
2024-07-20 23:15:24
349
原创 leetcode 二分查找,找数字最基础,找左右边界要多考虑细节
当二分查找都用闭区间的时候,也就是初始化的时候,左闭右闭的时候,更新左右的时候都要带上1,也就是找左侧边界为什么相等时还要收紧的解释:收紧右侧边界:当nums[mid] == target时,即当前中间元素等于目标值,这时不能立即返回mid作为结果。因为可能存在更左侧的相同元素。为了找到最左侧的索引,需要将搜索区间的右侧边界向左移动,即调整为right = mid。这样做可以继续在更左侧的区域搜索,直到找到最左侧的索引。也就是因为我们初始化 right = nums.length - 1 所以决定了我们的「
2024-07-19 00:17:38
374
原创 滑动窗口模板 解题关键在确定何时收缩窗口
为什么要「左闭右开」区间–方便处理边界条件 滑动窗口也是数组指针的技巧之一, 是快慢指针技巧分支里面的一个。。因为这样初始化时区间[0, 0)中没有元素,但只要让right向右移动(扩大)一位,区间[0, 1)就包含一个元素0了。如果你设置为两端都开的区间,那么让right向右移动一位后开区间(0, 1)仍然没有元素;如果你设置为两端都闭的区间,那么初始区间[0, 0]就包含了一个元素。这两种情况都会给边界处理带来不必要的麻烦。
2024-07-18 17:22:04
584
原创 数组快慢指针运用,个人总结,python
*在数组中并没有真正意义上的指针,但我们可以把索引当做数组中的指针,这样也可以在数组中施展双指针技巧,。,这是数字题目运用快慢指针技巧的题眼特征。
2024-07-16 19:05:00
277
原创 leetcode 数组
前k个元素都是不等于val的元素, 确保了前slow个元素都不是val,所以最后返回也就返回slow。先把螺旋矩阵放一放,会者不难,难者不会。学习规划:先代码随想录 后labuladong巩固。使用 while 来重复执行代码直到某个条件不再满足。== 也就是判断什么时候起始位置应该移动。使用 if 来基于条件执行一次性的决策。
2024-07-16 14:48:37
368
原创 labuladong刷题纲领总结
所以学完二叉树再去学动态规划,回溯算法等,所有的这些问题都是二叉树的递归问题,回归到遍历二叉树的问题。在打好了数组与链表的基础之后要花大量的时间练习二叉树。二叉树学明白了之后别的只不过是二叉树的变体,先注重框架,不要注重细节,培养抽象能力。
2024-07-15 23:34:21
148
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人