Leetcode刷题
princey2100
这个作者很懒,什么都没留下…
展开
-
Leetcode 538. 把二叉搜索树转换为累加树 Convert BST to Greater Tree - Python 递归法 二叉树部分总结
又因为这是一棵平衡二叉树所以是有序的,若想从后向前由大到小累加,则需要逆中序遍历(右中左,普通后续遍历是:左中右);需要pre全局变量,来记录之前元素之和;需要cur局部变量指向当前遍历元素;可以讲此题看为有序数组去理解:将数组从后往前不断累加;原创 2023-01-25 14:15:43 · 117 阅读 · 0 评论 -
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 · 120 阅读 · 0 评论 -
Leetcode 669. 修剪二叉搜索树 Trim a Binary Search Tree - Python 以递归法解题
【代码】669. 修剪二叉搜索树 Trim a Binary Search Tree - Python 以递归法解题。原创 2023-01-24 11:04:50 · 79 阅读 · 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 · 392 阅读 · 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 · 258 阅读 · 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 · 91 阅读 · 0 评论 -
Leetcode617. 合并二叉树 Merge Two Binary Trees - Python 递归法
1.若遇到root1非空,root2空,则把root1当前的根节点全都给到新树的对应根节点上。原创 2022-11-26 00:18:17 · 381 阅读 · 0 评论 -
Leetcode654. 最大二叉树 Maximum Binary Tree - Python 递归法
4.root.left 和 root.right 分别接着左右生成好的子树。3.将nums用索引分成左右两部分,分别递归传入递归函数;2.将最大值赋值给root.val;1.找出nums中最大值及其索引;原创 2022-11-25 22:00:53 · 211 阅读 · 0 评论 -
Leetcode.105. 从前序与中序遍历序列构造二叉树 Construct Binary Tree from Preorder and Inorder Traversal - Python 递归法
此题请参考Leetcode106。原创 2022-11-12 12:43:43 · 171 阅读 · 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 · 104 阅读 · 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 · 299 阅读 · 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 · 261 阅读 · 0 评论 -
Leetcode513. 找树左下角的值 Find Bottom Left Tree Value - python 递归、迭代法
记录当前叶子节点值,因为这是最深最左的叶子节点(最左是怎么来的?3.最后一层只有一个光杆司令 右 叶子节点,则取得是右光杆司令,不过题目的cases应该没有这种情况所以排除。层序遍历,for循环遍历queue队列中树最后一层叶子节点,就会得到最后一层。2.最后一层只有一个光杆司令 左 叶子节点,则取的是这个左光杆司令。2.递归停止条件,当遍历到叶子节点时,停止。当在本层调用下层递归时,需要先将本层depth+1,再传给下层;1.最后一层是满二叉树,全是叶子节点,则取最左边的。1.递归参数、返回值。原创 2022-10-16 15:43:56 · 420 阅读 · 0 评论 -
Leetcode404. 左叶子之和Sum of Left Leaves - Python 递归法
对每一个root都要如法炮制,这也是递归的核心思想所在;只有通过左叶子节点的父节点才能判断。本题难点在于,如何判断左叶子节点。1.求左子树的所有左叶子之和。2.求右子树的所有左叶子之和。3.求该root的左叶子。原创 2022-10-16 11:20:00 · 183 阅读 · 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 · 235 阅读 · 0 评论 -
Leetcode100. 相同的树 Same Tree - Python 递归法
此题与Leetcode101类似,只需改一下递归的单层逻辑。原创 2022-10-14 10:51:19 · 120 阅读 · 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 · 290 阅读 · 0 评论 -
Leetcode110. 平衡二叉树 Balanced Binary Tree - Python 递归法
依次计算根节点左右子树的高度,以判断该根节点所引导的树是否符合高度平衡树。2.只要有一个树不满足条件,则层层往上返回-1(非高度平衡树);1.先求左右子树高度,再用此高度判断是否为高度平衡树;3.只要有一个子树不满足条件,返回了-1,则全盘皆输。就这样一层一层左右子树去遍历。原创 2022-10-13 18:22:08 · 220 阅读 · 0 评论 -
Leetcode222. 完全二叉树的节点个数 Count Complete Tree Nodes - Python 迭代法、递归法
2.若不满足满二叉树,则如法炮制,分而治之:依次计算该节点的左右子树的节点数。若为满二叉树则用公式,否则继续如法炮制。2.递归结束条件,判断根节点所在树是否为满二叉树(左子树与右子树深度是否相同)1.若该根节点所在树为满二叉树,则用公式2^层数=节点数 计算。3.单层递归逻辑:若不满足满二叉树,则继续如法炮制,分而治之。依次求左右子树节点个数法,递归法。依次计算根节点的左右孩子节点数。原创 2022-10-12 16:56:11 · 202 阅读 · 0 评论 -
Leetcode111. 二叉树的最小深度 Minimum Depth of Binary Tree - Python 递归法
注意此题与014.二叉树的最大深度相似,但不能直接吗max()改成min()最后一种,左右都空,会作为结束递归条件,返回0,不会到达上述逻辑判断这一步。什么是叶子节点,左右孩子都为空的节点才是叶子节点!所以在得到子树的深度后,需要判断一下,有如下情况。依次判断左右子树深度法,递归法。原创 2022-10-12 12:05:28 · 152 阅读 · 0 评论 -
Leetcode559. N 叉树的最大深度 Maximum Depth of N-ary Tree - Python 递归法
【代码】559. N 叉树的最大深度 Maximum Depth of N-ary Tree - Python 递归法。原创 2022-10-11 14:15:44 · 90 阅读 · 0 评论 -
Leetcode101. 对称二叉树 Symmetric Tree - Python 递归法
【代码】101. 对称二叉树 Symmetric Tree - Python 递归法。原创 2022-10-11 12:15:18 · 157 阅读 · 0 评论 -
Leetcode590. N 叉树的后序遍历 N-ary Tree Postorder Traversal - Python 迭代法
注意需要依次遍历所有孩子节点,孩子位置。原创 2022-10-10 23:40:33 · 87 阅读 · 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 · 152 阅读 · 0 评论 -
Leetcode145. 二叉树的后序遍历 Binary Tree Postorder Traversal - Python 以递归/迭代算法实现
注意每一次递归的逻辑:根据前中后序遍历,调整result.append(root.val)相对其它两步的位置。注意traversal函数的函数参数:root根节点。注意结束递归条件:当root == None。原创 2022-09-21 23:28:57 · 193 阅读 · 0 评论 -
Leetcode94. 二叉树的中序遍历 Binary Tree Inorder Traversal - Python 以递归/迭代算法实现
注意每一次递归的逻辑:根据前中后序遍历,调整result.append(root.val)相对其它两步的位置。注意traversal函数的函数参数:root根节点。注意结束递归条件:当root == None。原创 2022-09-21 23:23:21 · 188 阅读 · 0 评论 -
Leetcode144. 二叉树的前序遍历 Binary Tree Preorder Traversal - Python 以递归/迭代算法实现
注意每一次递归的逻辑:根据前中后序遍历,调整result.append(root.val)相对其它两步的位置。注意traversal函数的函数参数:root根节点。注意结束递归条件:当root == None。原创 2022-09-21 22:49:07 · 293 阅读 · 0 评论 -
Leetcode 1047.删除字符串中的所有相邻重复项 Remove All Adjacent Duplicates In String - Python 以栈实现
class Solution: def removeDuplicates(self, s: str) -> str: stack = [] for i in s: if not stack or stack[-1] != i: #当 栈为空 或 待入栈元素与栈顶元素不等时 入栈 stack.append(i) else: #.原创 2022-03-29 23:05:46 · 547 阅读 · 0 评论 -
Leetcode 232. 用栈实现队列 Implement Queue using Stacks - Python 用双栈实现队列
class MyQueue: def __init__(self): self.stack_in = [] self.stack_out = [] def push(self, x: int) -> None: self.stack_in.append(x) def pop(self) -> int: if self.empty(): return None .原创 2022-03-26 12:38:45 · 952 阅读 · 0 评论 -
Leetcode 459. 重复的子字符串 Repeated Substring Pattern - Python KMP算法求next数组
class Solution: def repeatedSubstringPattern(self, s: str) -> bool: l = len(s) next = self.getNext(s) if next[l-1] != 0 and l % ( l- next[l-1]) == 0: return True #重复某一字段构成的数组的特点可以被if条件检查出来 abcdabcdabcd .原创 2022-03-26 11:04:08 · 67 阅读 · 0 评论 -
Leetcode 459. 重复的子字符串 Repeated Substring Pattern - Python KMP算法求next数组
class Solution: def repeatedSubstringPattern(self, s: str) -> bool: l = len(s) next = self.getNext(s) if next[l-1] != 0 and l % ( l- next[l-1]) == 0: return True #重复某一字段构成的数组的特点可以被if条件检查出来 abcdabcdabcd .原创 2022-03-29 23:06:02 · 137 阅读 · 0 评论 -
Leetcode 28. 实现 strStr() Implement strStr() - Python - KMP算法
class Solution: def strStr(self, haystack: str, needle: str) -> int: a = len(haystack) b = len(needle) if b == 0: return 0 next = self.getnext(b,needle) j=0 for i in range(a): .原创 2022-03-25 21:37:32 · 627 阅读 · 0 评论 -
Leetcode 剑指 Offer 58 - II. 左旋转字符串 LCOF - Python
class Solution: def reverseLeftWords(self, s: str, n: int) -> str: m = len(s) temp = list(s) temp.extend(['']*n) front, rear = 0, m for i in range(0,n): temp[rear] = temp[front] rear +.原创 2022-03-22 20:35:19 · 314 阅读 · 0 评论 -
Leetcode 151.颠倒字符串中的单词 Reverse Words in a String - Python 双指针法
class Solution: def reverseWords(self, s: str) -> str: def trim_space(s:str): res = [] front = 0 rear = len(s)-1 while s[front] == ' ': front += 1 while s[rear] == .原创 2022-03-22 17:17:09 · 577 阅读 · 0 评论 -
Leetcode 剑指 Offer 05. 替换空格 LCOF - Python
class Solution: def replaceSpace(self, s: str) -> str: counter = s.count(' ') res = list(s) res.extend([' ']*counter*2) front = len(s)-1 rear = len(res)-1 while front >= 0: if res[front.原创 2022-03-22 15:02:34 · 519 阅读 · 0 评论 -
Leetcode 541.反转字符串II Reverse String II - Python
class Solution: def reverseStr(self, s: str, k: int) -> str: remain = len(s) res = list(s) def swap(front:int,rear:int) -> str: while front < rear: res[front], res[rear] = res[rear], res[fro.原创 2022-03-21 23:00:05 · 257 阅读 · 0 评论 -
Leetcode 344.反转字符串 Reverse String - Python
class Solution: def reverseString(self, s: List[str]) -> None: """ Do not return anything, modify s in-place instead. """ front = 0 n = len(s) rear = n - 1 for i in range(n): if fr.原创 2022-03-21 18:13:11 · 287 阅读 · 0 评论 -
Leetcode 242. 有效的字母异位词 Valid Anagram - Python 哈希法
class Solution: def isAnagram(self, s: str, t: str) -> bool: record = [0] *26 for i in s:# 用哈希法( 哈希函数:ord(i)-ord('a') )将'a'映射为0 'b'映射为1..'z'映射为25 其它字母同理 record[ord(i)-ord('a')] += 1 #此处不用记住ASCII 用ord()计算即可 f.原创 2022-02-25 21:15:19 · 246 阅读 · 0 评论 -
Leetcode 142. 环形链表 II Linked List Cycle II - Python 双指针法
# Definition for singly-linked list.# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solution: def detectCycle(self, head: ListNode) -> ListNode: fast, slow = head, head #让快慢指针.原创 2022-12-06 22:57:02 · 375 阅读 · 0 评论 -
Leetcode 面试题 02.07. 链表相交 Intersection of Two Linked Lists LCCI - Python 双指针法
# Definition for singly-linked list.# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solution: def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode: curA, curB =.原创 2022-02-24 22:19:19 · 218 阅读 · 0 评论