自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(97)
  • 收藏
  • 关注

原创 Leetcode 90.子集II - Subset II - Python - 回溯法

1.此题与Leetcode78.子集,类似。但是加了一个条件就是给定的nums不是唯一的。1.是i > start,这些边缘的位置要考虑清楚。

2024-02-08 12:26:55 597

原创 Leetcode78.子集 - Subset - Python - 回溯法

1.本题不需要剪枝,因为要遍历树的每一个节点,并将当前经过的节点路径path都记录下来,每一个path都是子集。2.此题可以不写终止递归条件,因为在for循环中,遍历完就自己结束了。1.注意for循环中,每次递归是i+1,而不是start+1。

2024-02-08 09:07:31 538

原创 Leetcode93.复原IP地址 - Restore IP Addresses - Python - 回溯法

2.在此基础上,需要添加逗点,以及当前进入递归函数的字符串是否合法。1.此题与Leetcode131.分割回文串十分相似。

2024-01-29 13:48:00 435

原创 Leetcode131.分割回文串-Palindrome Patitioning-Python-回溯法

这是确认是否是回文串的索引下标,如果是回文串的话,其实索引startIndex不变,只需要将终止索引+1, 即i+1。例如'aab' startIndex==1, i==2,那么待判断的回文串就是ab.假设ab是回文串,那么索引 startIndex, i+1 就代表着aab的ab。2.针对s的每一个字母,比如在切割了第一个字母之后,还有很多种切割方式,这是由不断的调用递归函数来实现的。1.切割回文串,可以用解决找组合问题的思路解决,而解决组合问题,可以用回溯法,故本题选择回溯法。

2024-01-25 17:28:48 466

原创 Leetcode40.组合总和II - Combination Sum - Python - 回溯法

2.需要先将candidates排序,以进行candidates[i]和candidates[i-1]的比较。1.理解数层去重和树枝去重。本题只需要数层去重。树枝去重是通过每次递归时的i+1来实现的。used[i-1]不写也没事。

2024-01-24 16:03:30 444

原创 Leetcode 39.组合总和 - Combination Sum - Python - 回溯法

2.略过相同252,522这种相同解(以2,5,3举例,当第一层循环遍历到5(i=1,此处i就是startIndex),调用递归函数时,继续传入i,即startIndex。那么进入递归函数(第二层循环)时,i依然是1,依然是从5开始遍历,而不是从i=0,集合中的第一个元素2开始遍历。因为2开始的遍历已经结束或正在遍历中,不用再回去重做无用功了)。self.result.append(self.path),这样写会将引用放入self.result,里面的数据会随self.path的改变而改变。

2024-01-24 10:33:32 387

原创 Leetcode 17.电话号码的字母组合 - Letter Combinations of a Phone Number - Python - 回溯法

这道题有一点很有趣的地方是,你需要先遍历给定的digits字符串,此处可想象成树型结构。digits字符串的长度即树的深度。而遍历字符串,在此处,是以递归的方式进行的。而abc,和def之间的排列组合,是通过多个for循环嵌套进行的(之所以这么说,是因为一个递归里面有一个for循环,多次递归调用里,在逻辑上,就隐含着多个for循环。并不是说实际上在代码字面上有多层嵌套的for循环)。3.确定单层遍历逻辑;1.回溯函数的参数;

2024-01-23 14:48:57 397

原创 Leetcode 216. 组合总和 III Combination Sum III - Java 以回溯法解题

记住剪枝操作:9 - (k-path.size()) + 1。

2023-05-01 12:23:22 109

原创 Leetcode 77. 组合 Combinations 回溯法 Java

剪枝需要记住一个公式,n - ( k-path.size() ) + 1,其中括号内的内容为还需要几个数字才能满足k。需要一个startIndex变量记录下一层for循环应该从哪里开始;n为1234,即树的宽度;每一次递归函数都是一个for循环;

2023-03-09 22:49:48 125

原创 Leetcode 538. 把二叉搜索树转换为累加树 Convert BST to Greater Tree - Python 递归法 二叉树部分总结

又因为这是一棵平衡二叉树所以是有序的,若想从后向前由大到小累加,则需要逆中序遍历(右中左,普通后续遍历是:左中右);需要pre全局变量,来记录之前元素之和;需要cur局部变量指向当前遍历元素;可以讲此题看为有序数组去理解:将数组从后往前不断累加;

2023-01-25 14:15:43 102

原创 Leetcode 108. 将有序数组转换为二叉搜索树 Convert Sorted Array to Binary Search Tree - Python 递归法

若直接 mid = (left + right) / 2 , 则有可能因left和right的值都接近infinite而发生计算错误。注意计算数组中间元素下标,mid = left + (right-left) // 2。注意递归结束条件非常重要:if left>right: return None。依次用nums[mid]左边和右边数组,构建root的左子树、右子树;找到数组中间元素nums[mid],并将其作为树的根结点root;当数组左索引>右索引,则意味着数组中的元素都以放入二叉树中。

2023-01-25 13:08:16 101

原创 Leetcode 669. 修剪二叉搜索树 Trim a Binary Search Tree - Python 以递归法解题

【代码】669. 修剪二叉搜索树 Trim a Binary Search Tree - Python 以递归法解题。

2023-01-24 11:04:50 66

原创 Leetcode 450. 删除二叉搜索树中的节点 Delete Node in a BST - Python 递归法

当key不在BST中时,则遍历BST的某一分支都找不到,对吧?即返回到第一层,此时的root和一开始传入的待查找root是一模一样的BST。4.左孩子L和右孩子R都不为None,则找到右子树R的最底层的最左孩子UL。然后让L成为UL的左孩子。1.左右子孩子为None,直接删了完事儿,返回None,与第2.情况一致,可以共用代码;一、key不在二叉搜索树(BST)中,则依此确定递归停止条件,返回None;2.左孩子为None,则返回右孩子为根节点;3.右孩子为None,则返回左孩子为根节点;

2022-12-19 13:45:28 379

原创 Leetcode701. 二叉搜索树中的插入操作 Insert into a Binary Search Tree - Python 递归法/迭代法

递归单层逻辑:val与各个root.val比较,大了就往右走,小了就往左走。最后依然给出了迭代的方法,迭代的方法就需要记录当前遍历节点的父节点了,这个和没有返回值的递归函数实现的代码逻辑是一样的。根据父节点root.val(parent.val) 与 val的值大小关系,决定插在root的左孩子还是右孩子;然后在递归中,我们重点讲了如何通过递归函数的返回值完成新加入节点和其父节点的赋值操作,并强调了搜索树的有序性。在代码中时parent);val与各个root.val比较,大了就往右走,小了就往左走;

2022-12-12 00:33:59 235

原创 Leetcode235. 二叉搜索树的最近公共祖先 Lowest Common Ancestor of a Binary Search Tree - Python 递归法/迭代法

上面这个递归函数没必要写结束条件,因为BST中一定有且只有唯一的p和q,从根节点出发,左拐右拐左拐右拐,只会走一跟道,那就是成华大道(doge)。从根节点开始,只要root.val 大于 p 和 q的值(root.val介于[p, q],左闭右闭区间),就往左子树走,继续找父节点介于左右子树之间的情况;不用使用回溯,二叉搜索树自带方向性,可以方便的从上向下查找目标区间,遇到目标区间内的节点,直接返回。此题与236类似,但需要利用好二叉搜索树的特点,即父节点值的大小介于左右子树节点值之间。

2022-12-10 23:28:49 79

原创 Leetcode236. 二叉树的最近公共祖先 Lowest Common Ancestor of a Binary Tree - Python 递归法

1.当当前root==p or root == q 就将root返回,当同一层递归逻辑里的left 和 right都不为空时,说明当前root为所求lowest common ancestor;2.若只有left空或只有right空,则返回非空的。因为非空的即为所求,是从底层一直回溯上来的;3.若left和right都为空,则返回空。可能为叶子几点或该树的分叉不满足条件;

2022-12-09 17:28:10 753

原创 Leetcode501. 二叉搜索树中的众数 Find Mode in Binary Search Tree - Python 递归法

法一:利用二叉搜索树有序特性,中序遍历为有序数组,然后用哈希表统计频率,再将高频的众数返回即可。法二:利用二叉搜索树特性,边遍历,边比较。

2022-12-08 16:57:15 198

原创 Leetcode530. 二叉搜索树的最小绝对差 Minimum Absolute Difference in BST - Python 递归法

思路:1.中序遍历二叉搜索树得到的为一个有序数组,可利用此特性求Minimum Absolute Difference。2.一个有数数组两两之间数值间隔最小,所以只需比较两两之间的差值大小。递归法: 递归法(边中序遍历边计算):

2022-12-08 13:36:04 284

原创 Leetcode98. 验证二叉搜索树 Validate Binary Search Tree - Python 递归法/迭代法

思路:二叉搜索树中序遍历结果是一个有序数组。利用此特性,可判断是否是一个正确的二叉搜索树。递归法: 递归法(常规法:一边中序遍历,一边检查是否是有序): 虽然但是,如果测试数据中有-float("INF"),而cur_max也等于-float("INF"),就无法比较各节点之间的大小了。所以需要新方法,用一个pre变量记录下前一个root.val,将最底层最左边的节点作为第一个赋值给pre的root:

2022-12-08 12:59:33 124

原创 Leetcode 142. 环形链表 II Linked List Cycle II - Python 双指针法

# Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: def detectCycle(self, head: ListNode) -> ListNode: fast, slow = head, head #让快慢指针.

2022-12-06 22:57:02 292

原创 Leetcode700. 二叉搜索树中的搜索 Search in a Binary Search Tree - Python 递归法/迭代法

二叉搜索树的特点:左子树的所有节点值 都比 root.val小右子树的所有节点值 都比 root.val大可利用此特性写code:递归法 迭代法:

2022-12-06 22:55:03 153

原创 Leetcode617. 合并二叉树 Merge Two Binary Trees - Python 递归法

1.若遇到root1非空,root2空,则把root1当前的根节点全都给到新树的对应根节点上。

2022-11-26 00:18:17 322

原创 Leetcode654. 最大二叉树 Maximum Binary Tree - Python 递归法

4.root.left 和 root.right 分别接着左右生成好的子树。3.将nums用索引分成左右两部分,分别递归传入递归函数;2.将最大值赋值给root.val;1.找出nums中最大值及其索引;

2022-11-25 22:00:53 197

原创 Leetcode.105. 从前序与中序遍历序列构造二叉树 Construct Binary Tree from Preorder and Inorder Traversal - Python 递归法

此题请参考Leetcode106。

2022-11-12 12:43:43 162

原创 Leetcode.106 从中序与后序遍历序列构造二叉树 Construct Binary Tree from Inorder and Postorder Traversal - Python 递归法

root作为根节点所引导的二叉树,在各层递归函数不断地return的过程中,不断“羽翼丰满“,直到最后构建成一颗完整的二叉树。6.将划分好的inorder_right postorder_right 传入递归函数,重复1-4;5.将划分好的inorder_left postorder_left 传入递归函数,重复1-4;2.用此根节点构建一颗新二叉树,用作root.val,并用其划分中序序列的左子树与右子树;1.后序序列的最后一个元素为二叉树的根结点;4.以3特点划分后序遍历的左子树与右子树;

2022-11-12 12:17:19 88

原创 Leetcode113.路径总和II Path Sum II - Python 递归法

前者只是将res指针放入result中,这样的话,随着res在递归深入回溯的过程中不断变化,result数组的元素也会不断变化。三行是并列的,可以放在主函数pathSum中并列运行,在isornot()中可以调用local variable result,所以不需要单独创建self.result。1.result.append(res) 与 result.append(res[:])的功能是不同的。2.需要在终止条件处,添加result.append(res[:])逻辑。此题与112题相似。

2022-11-11 13:54:48 268

原创 Leetcode112. 路径总和 Path Sum - Python 递归法

4.递归结束条件:判断到叶子节点时,targetSum是否为0;1.注意targetsum的用法:每经过一个节点,就将其减去当前经过的节点值,如此到根节点,就正好为0。if isornot(): return true 会一层一层向上返回true,直到第一层递归。2.targetSum - root.left.val 中隐藏着回溯思想。3.递归函数参数为root、targetSum & 返回值为bool。5.单层递归逻辑:若root左右孩子不为空,则依次继续递归。

2022-11-11 11:47:26 226

原创 Leetcode513. 找树左下角的值 Find Bottom Left Tree Value - python 递归、迭代法

记录当前叶子节点值,因为这是最深最左的叶子节点(最左是怎么来的?3.最后一层只有一个光杆司令 右 叶子节点,则取得是右光杆司令,不过题目的cases应该没有这种情况所以排除。层序遍历,for循环遍历queue队列中树最后一层叶子节点,就会得到最后一层。2.最后一层只有一个光杆司令 左 叶子节点,则取的是这个左光杆司令。2.递归停止条件,当遍历到叶子节点时,停止。当在本层调用下层递归时,需要先将本层depth+1,再传给下层;1.最后一层是满二叉树,全是叶子节点,则取最左边的。1.递归参数、返回值。

2022-10-16 15:43:56 402

原创 Leetcode404. 左叶子之和Sum of Left Leaves - Python 递归法

对每一个root都要如法炮制,这也是递归的核心思想所在;只有通过左叶子节点的父节点才能判断。本题难点在于,如何判断左叶子节点。1.求左子树的所有左叶子之和。2.求右子树的所有左叶子之和。3.求该root的左叶子。

2022-10-16 11:20:00 166

原创 Leetcode572. 另一棵树的子树 Subtree of Another Tree - Python 迭代法

2.若1不成立,subTree是否是root左子树的子树。3.若2不成立,subTree是否是root右子树的子树。2.root左子树 等于 subTree左子树。3.root右子树 等于 subTree右子树。1.root 是否等于 subTree。三者是 和 and 关系。三者是 或 or 关系。

2022-10-14 13:01:20 173

原创 Leetcode100. 相同的树 Same Tree - Python 递归法

此题与Leetcode101类似,只需改一下递归的单层逻辑。

2022-10-14 10:51:19 107

原创 Leetcode257. 二叉树的所有路径 Binary Tree Paths - Python递归法/回溯法

其中 self.traversal(root.left, path + '->' , result) 的 path + '->' 隐藏了回溯步骤。因为path是一个局部变量,本轮递归函数结束后,就分崩离析了,就回到上一层递归的残局了。返回值:无返回值,因为在遇到叶子节点时,就操作了result.append(path) result 已通过全局变量修改。因为一旦找到叶子节点就要处理逻辑了,即result.append(path)若非叶子节点,则将root.val加入path后,继续递归遍历左右子树。

2022-10-13 23:31:15 279

原创 Leetcode110. 平衡二叉树 Balanced Binary Tree - Python 递归法

依次计算根节点左右子树的高度,以判断该根节点所引导的树是否符合高度平衡树。2.只要有一个树不满足条件,则层层往上返回-1(非高度平衡树);1.先求左右子树高度,再用此高度判断是否为高度平衡树;3.只要有一个子树不满足条件,返回了-1,则全盘皆输。就这样一层一层左右子树去遍历。

2022-10-13 18:22:08 177

原创 Leetcode222. 完全二叉树的节点个数 Count Complete Tree Nodes - Python 迭代法、递归法

2.若不满足满二叉树,则如法炮制,分而治之:依次计算该节点的左右子树的节点数。若为满二叉树则用公式,否则继续如法炮制。2.递归结束条件,判断根节点所在树是否为满二叉树(左子树与右子树深度是否相同)1.若该根节点所在树为满二叉树,则用公式2^层数=节点数 计算。3.单层递归逻辑:若不满足满二叉树,则继续如法炮制,分而治之。依次求左右子树节点个数法,递归法。依次计算根节点的左右孩子节点数。

2022-10-12 16:56:11 183

原创 Leetcode111. 二叉树的最小深度 Minimum Depth of Binary Tree - Python 递归法

注意此题与014.二叉树的最大深度相似,但不能直接吗max()改成min()最后一种,左右都空,会作为结束递归条件,返回0,不会到达上述逻辑判断这一步。什么是叶子节点,左右孩子都为空的节点才是叶子节点!所以在得到子树的深度后,需要判断一下,有如下情况。依次判断左右子树深度法,递归法。

2022-10-12 12:05:28 134

原创 Leetcode559. N 叉树的最大深度 Maximum Depth of N-ary Tree - Python 递归法

【代码】559. N 叉树的最大深度 Maximum Depth of N-ary Tree - Python 递归法。

2022-10-11 14:15:44 68

原创 Leetcode101. 对称二叉树 Symmetric Tree - Python 递归法

【代码】101. 对称二叉树 Symmetric Tree - Python 递归法。

2022-10-11 12:15:18 118

原创 Leetcode590. N 叉树的后序遍历 N-ary Tree Postorder Traversal - Python 迭代法

注意需要依次遍历所有孩子节点,孩子位置。

2022-10-10 23:40:33 81

原创 Leetcode589. N 叉树的前序遍历 N-ary Tree Preorder Traversal - Python 迭代法

注意需要依次遍历孩子节点。

2022-10-10 23:36:28 59

原创 Leetcode226. 翻转二叉树 Invert Binary Tree - Python - 迭代法层序遍历法

1.注意这是层序遍历;(也可用前序和后续遍历)其它与迭代层序遍历一样。2.除了# 关键一步。

2022-09-24 23:31:22 151

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除