leetcode
princey2100
这个作者很懒,什么都没留下…
展开
-
Leetcode 669. 修剪二叉搜索树 Trim a Binary Search Tree - Python 以递归法解题
【代码】669. 修剪二叉搜索树 Trim a Binary Search Tree - Python 以递归法解题。原创 2023-01-24 11:04:50 · 87 阅读 · 0 评论 -
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 · 400 阅读 · 0 评论 -
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 · 263 阅读 · 0 评论 -
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 · 99 阅读 · 0 评论 -
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 · 851 阅读 · 0 评论 -
Leetcode501. 二叉搜索树中的众数 Find Mode in Binary Search Tree - Python 递归法
法一:利用二叉搜索树有序特性,中序遍历为有序数组,然后用哈希表统计频率,再将高频的众数返回即可。法二:利用二叉搜索树特性,边遍历,边比较。原创 2022-12-08 16:57:15 · 245 阅读 · 0 评论 -
Leetcode530. 二叉搜索树的最小绝对差 Minimum Absolute Difference in BST - Python 递归法
思路:1.中序遍历二叉搜索树得到的为一个有序数组,可利用此特性求Minimum Absolute Difference。2.一个有数数组两两之间数值间隔最小,所以只需比较两两之间的差值大小。递归法:递归法(边中序遍历边计算):原创 2022-12-08 13:36:04 · 314 阅读 · 0 评论 -
Leetcode98. 验证二叉搜索树 Validate Binary Search Tree - Python 递归法/迭代法
思路:二叉搜索树中序遍历结果是一个有序数组。利用此特性,可判断是否是一个正确的二叉搜索树。递归法:递归法(常规法:一边中序遍历,一边检查是否是有序):虽然但是,如果测试数据中有-float("INF"),而cur_max也等于-float("INF"),就无法比较各节点之间的大小了。所以需要新方法,用一个pre变量记录下前一个root.val,将最底层最左边的节点作为第一个赋值给pre的root:原创 2022-12-08 12:59:33 · 187 阅读 · 0 评论 -
Leetcode700. 二叉搜索树中的搜索 Search in a Binary Search Tree - Python 递归法/迭代法
二叉搜索树的特点:左子树的所有节点值 都比 root.val小右子树的所有节点值 都比 root.val大可利用此特性写code:递归法迭代法:原创 2022-12-06 22:55:03 · 187 阅读 · 0 评论 -
Leetcode654. 最大二叉树 Maximum Binary Tree - Python 递归法
4.root.left 和 root.right 分别接着左右生成好的子树。3.将nums用索引分成左右两部分,分别递归传入递归函数;2.将最大值赋值给root.val;1.找出nums中最大值及其索引;原创 2022-11-25 22:00:53 · 222 阅读 · 0 评论 -
Leetcode.105. 从前序与中序遍历序列构造二叉树 Construct Binary Tree from Preorder and Inorder Traversal - Python 递归法
此题请参考Leetcode106。原创 2022-11-12 12:43:43 · 179 阅读 · 0 评论 -
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 · 111 阅读 · 0 评论 -
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 · 316 阅读 · 0 评论 -
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 · 278 阅读 · 0 评论 -
Leetcode513. 找树左下角的值 Find Bottom Left Tree Value - python 递归、迭代法
记录当前叶子节点值,因为这是最深最左的叶子节点(最左是怎么来的?3.最后一层只有一个光杆司令 右 叶子节点,则取得是右光杆司令,不过题目的cases应该没有这种情况所以排除。层序遍历,for循环遍历queue队列中树最后一层叶子节点,就会得到最后一层。2.最后一层只有一个光杆司令 左 叶子节点,则取的是这个左光杆司令。2.递归停止条件,当遍历到叶子节点时,停止。当在本层调用下层递归时,需要先将本层depth+1,再传给下层;1.最后一层是满二叉树,全是叶子节点,则取最左边的。1.递归参数、返回值。原创 2022-10-16 15:43:56 · 433 阅读 · 0 评论 -
Leetcode404. 左叶子之和Sum of Left Leaves - Python 递归法
对每一个root都要如法炮制,这也是递归的核心思想所在;只有通过左叶子节点的父节点才能判断。本题难点在于,如何判断左叶子节点。1.求左子树的所有左叶子之和。2.求右子树的所有左叶子之和。3.求该root的左叶子。原创 2022-10-16 11:20:00 · 192 阅读 · 0 评论 -
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 · 256 阅读 · 0 评论 -
Leetcode100. 相同的树 Same Tree - Python 递归法
此题与Leetcode101类似,只需改一下递归的单层逻辑。原创 2022-10-14 10:51:19 · 128 阅读 · 0 评论 -
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 · 299 阅读 · 0 评论 -
Leetcode110. 平衡二叉树 Balanced Binary Tree - Python 递归法
依次计算根节点左右子树的高度,以判断该根节点所引导的树是否符合高度平衡树。2.只要有一个树不满足条件,则层层往上返回-1(非高度平衡树);1.先求左右子树高度,再用此高度判断是否为高度平衡树;3.只要有一个子树不满足条件,返回了-1,则全盘皆输。就这样一层一层左右子树去遍历。原创 2022-10-13 18:22:08 · 239 阅读 · 0 评论 -
Leetcode222. 完全二叉树的节点个数 Count Complete Tree Nodes - Python 迭代法、递归法
2.若不满足满二叉树,则如法炮制,分而治之:依次计算该节点的左右子树的节点数。若为满二叉树则用公式,否则继续如法炮制。2.递归结束条件,判断根节点所在树是否为满二叉树(左子树与右子树深度是否相同)1.若该根节点所在树为满二叉树,则用公式2^层数=节点数 计算。3.单层递归逻辑:若不满足满二叉树,则继续如法炮制,分而治之。依次求左右子树节点个数法,递归法。依次计算根节点的左右孩子节点数。原创 2022-10-12 16:56:11 · 216 阅读 · 0 评论 -
Leetcode590. N 叉树的后序遍历 N-ary Tree Postorder Traversal - Python 迭代法
注意需要依次遍历所有孩子节点,孩子位置。原创 2022-10-10 23:40:33 · 95 阅读 · 0 评论 -
Leetcode589. N 叉树的前序遍历 N-ary Tree Preorder Traversal - Python 迭代法
注意需要依次遍历孩子节点。原创 2022-10-10 23:36:28 · 82 阅读 · 0 评论 -
Leetcode226. 翻转二叉树 Invert Binary Tree - Python - 迭代法层序遍历法
1.注意这是层序遍历;(也可用前序和后续遍历)其它与迭代层序遍历一样。2.除了# 关键一步。原创 2022-09-24 23:31:22 · 188 阅读 · 0 评论 -
Leetcode111. 二叉树的最小深度 Minimum Depth of Binary Tree - Python 以迭代法解题
这一步最重要 只需要:若判断左孩子和右孩子同时为空时,则返回当前depth。其它和层序遍历二叉树思路一致。原创 2022-09-24 22:39:01 · 152 阅读 · 0 评论 -
Leetcode104. 二叉树的最大深度 Maximum Depth of Binary Tree - Python 以迭代/递归法解题
注意全局变量self.res的使用,以及depth+1 因为深度和depth始终差1。同迭代层序遍历二叉树。原创 2022-09-24 17:48:06 · 138 阅读 · 0 评论 -
Leetcode117. 填充每个节点的下一个右侧节点指针 II Populating Next Right Pointers in Each Node II - Python 以迭代法解题
同Leetcode116。原创 2022-09-24 17:29:41 · 97 阅读 · 0 评论 -
Leetcode116. 填充每个节点的下一个右侧节点指针 Populating Next Right Pointers in Each Node - Python 以迭代法解题
遍历到每行非最后节点时,将cur.next指向queue[0], 注意这一步不能queue.popleft,否则就把下一层待遍历的孩子节点给弹出了。在遍历到每行最后一个节点时,break;把result和results都去掉;原创 2022-09-24 16:55:54 · 83 阅读 · 0 评论 -
Leedcode515.在每个树行中找最大值 Find Largest Value in Each Tree Row - Python 以迭代/递归法实现
【代码】Leedcode515.在每个树行中找最大值 Find Largest Value in Each Tree Row - Python 以迭代/递归法实现。原创 2022-09-24 16:09:35 · 103 阅读 · 0 评论 -
Leetcode429. N叉数的层序遍历 N-ray Tree Level Order Traversal - Python 以迭代法实现
2.将该层各根节点的孩子们,依次入deque,供下一轮while里的for遍历;与二叉树层序遍历不同的是,这里的孩子节点是由Node节点以列表的形式保存的。3.依次遍历在上一层加入到deque的孩子们;原创 2022-09-24 15:54:44 · 143 阅读 · 0 评论 -
Leetcode637. 二叉树的层平均值 Average of Levels in Binary Tree - Python 以递归/迭代算法实现
很简单,就等于层序遍历二叉树。原创 2022-09-24 14:45:21 · 694 阅读 · 0 评论 -
Leetcode199. 二叉树的右视图 Binary Tree Right Side View - Python 以递归/迭代算法实现
注意不要看到是右视图,就忽略遍历左孩子if root.left: traversal(root.left, depth + 1)。2.在for循环体里,依次将每个节点的左右孩子(下一层节点)加入到queue,待下一轮while用;当一个根节点没有右孩子时,左孩子也能被看到。如此,无需遍历每层非最右侧的子节点的值,节约了时间复杂度。本题就是考察二叉树的层序遍历而已,没什么难的。迭代法层序遍历二叉树。原创 2022-09-24 13:12:34 · 718 阅读 · 0 评论 -
Leetcode107. 二叉树的层序遍历 II Binary Tree Level Order Traversal II - Python 以递归/迭代算法实现
只需将resutlts数组颠倒顺序即可。只需将resutlts数组颠倒顺序即可。原创 2022-09-24 11:22:13 · 631 阅读 · 0 评论 -
Leetcode102. 二叉树的层序遍历 Binary Tree Level Order Traversal - Python 以递归/迭代算法实现
2.函数体具体操作:当遇到新层,则添加[];遇到父节点就将root.val输出;然后分别将左孩子、右孩子依次用遍历父节点一样的方式(递归的方式)遍历孩子节点。3.递归终止条件: #实际上该递归的结束条件为 root.left == None 和 root.right == None。1.调用函数参数:root,depth-当前深度。原创 2022-09-23 22:00:04 · 160 阅读 · 0 评论 -
Leetcode145. 二叉树的后序遍历 Binary Tree Postorder Traversal - Python 以递归/迭代算法实现
注意每一次递归的逻辑:根据前中后序遍历,调整result.append(root.val)相对其它两步的位置。注意traversal函数的函数参数:root根节点。注意结束递归条件:当root == None。原创 2022-09-21 23:28:57 · 201 阅读 · 0 评论 -
Leetcode94. 二叉树的中序遍历 Binary Tree Inorder Traversal - Python 以递归/迭代算法实现
注意每一次递归的逻辑:根据前中后序遍历,调整result.append(root.val)相对其它两步的位置。注意traversal函数的函数参数:root根节点。注意结束递归条件:当root == None。原创 2022-09-21 23:23:21 · 202 阅读 · 0 评论 -
Leetcode144. 二叉树的前序遍历 Binary Tree Preorder Traversal - Python 以递归/迭代算法实现
注意每一次递归的逻辑:根据前中后序遍历,调整result.append(root.val)相对其它两步的位置。注意traversal函数的函数参数:root根节点。注意结束递归条件:当root == None。原创 2022-09-21 22:49:07 · 309 阅读 · 0 评论 -
Leetcode347. 前 K 个高频元素 Top K Frequent Elements - Python 以小顶堆实现
Leetcode347. 前 K 个高频元素 Top K Frequent Elements - Python 以小顶堆实现原创 2022-09-21 12:01:56 · 334 阅读 · 0 评论 -
Leetcode239. 滑动窗口最大值 Sliding Window Maximum - Python 以单调队列实现
注意理解 在压入新元素时,如果待压入元素比当前队列中的元素都大,(必须是>,>=不能通过某些示例) 则需要把队列中的元素都踢出去。这样的话才能保证最大的元素始终在单调队列的左出口。注意理解 只有当待踢出元素==单调队列最左边元素时,才真正将单调队列最左边元素踢出。其它情况下,待提出元素在push函数中,已经被踢出去了,不需要再踢一次。注意理解 1.单调队列是从右至左单调递减或递增的,此处是递减。2.单调队列最右边的出口始终是滑动窗口中最大的元素。原创 2022-09-13 10:47:21 · 379 阅读 · 0 评论 -
Leetcode150. 逆波兰表达式求值 Evaluate Reverse Polish Notation - Python 以栈实现
class Solution: def evalRPN(self, tokens: List[str]) -> int: stack = [] for i in tokens: if i in {"+","-","*","/"}: last = stack.pop() first = stack.pop() .原创 2022-03-30 11:14:00 · 1146 阅读 · 0 评论