LeetCode刷题指南
第 0 章 hot100
0.1 哈希
0.2 双指针
0.3 滑动窗口
0.4 子串
0.5 普通数组
0.6 矩阵
0.7 链表
0.8 二叉树
0.9 图论
0.10 回溯
0.11 二分查找
0.12 栈
0.13 堆
0.14 贪心算法
0.15 动态规划
0.16 多维动态规划
0.17 技巧
第0-1章 面试经典150
0.1 数组/字符串
0.2 双指针
0.3 滑动窗口
链表
二叉树
第 1 章 最易懂的贪心算法
1.1 算法解释
1.2 分配问题
1.3 区间问题
1.4 练习
第 2 章 玩转双指针
2.1 算法解释
2.2 Two Sum
2.3 归并两个有序数组
2.4 滑动窗口
2.5 快慢指针
2.6 练习
第 3 章 居合斩!二分查找
3.1 算法解释
3.2 求开方
3.3 查找区间
3.4 查找峰值
3.5 旋转数组查找数字
3.6 练习
第 4 章 千奇百怪的排序算法
4.1 常用排序算法
4.2 快速选择
4.3 桶排序
4.4 练习
第 5 章 一切皆可搜索
5.1 算法解释
5.2 深度优先搜索
5.3 回溯法
5.4 广度优先搜索
5.5 练习
第 6 章 深入浅出动态规划
6.1 算法解释
6.2 基本动态规划:一维
6.3 基本动态规划:二维
6.4 分割类型题
6.5 子序列问题
6.6 背包问题
6.7 字符串编辑
6.8 股票交易
6.9 练习
第 7 章 化繁为简的分治法
7.1 算法解释
7.2 表达式问题
7.3 练习
第 8 章 巧解数学问题
8.1 引言
8.2 公倍数与公因数
8.3 质数
8.4 数字处理
8.5 随机与取样
8.6 练习
第 9 章 神奇的位运算
9.1 常用技巧
9.2 位运算基础问题
9.3 二进制特性
9.4 练习
第 10 章 妙用数据结构
10.1 C++ STL
10.2 Python 常用数据结构
10.3 数组
10.4 栈和队列
10.5 单调栈
10.6 优先队列
10.7 双端队列
10.8 哈希表
10.9 多重集合和映射
10.10 前缀和与积分图
10.11 练习
第 11 章 令人头大的字符串
11.1 引言
11.2 字符串比较
11.3 字符串理解
11.4 字符串匹配
11.5 练习
第 12 章 指针三剑客之一:链表
12.1 数据结构介绍
12.2 链表的基本操作
12.3 其它链表技巧
12.4 练习
第 13 章 指针三剑客之二:树
13.1 数据结构介绍
13.2 树的递归
13.3 层次遍历
13.4 前中后序遍历
13.5 二叉查找树
13.6 字典树
13.7 练习
第 14 章 指针三剑客之三:图
14.1 数据结构介绍
14.2 二分图
14.3 拓扑排序
14.4 练习
第 15 章 更加复杂的数据结构
15.1 引言
15.2 并查集
15.3 复合数据结构
15.4 练习
第16章 面试题
第 17 章 十大经典排序算法
README
本文档使用 MrDoc 发布
-
+
首页
0.8 二叉树
[94. 二叉树的中序遍历](https://leetcode.cn/problems/binary-tree-inorder-traversal/?envType=study-plan-v2&envId=top-100-liked) ```py class Solution: def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]: ans = [] def helper(node): if not node: return helper(node.left) ans.append(node.val) helper(node.right) helper(root) return ans ``` [*104. 二叉树的最大深度](https://leetcode.cn/problems/maximum-depth-of-binary-tree/?envType=study-plan-v2&envId=top-100-liked) ```py class Solution: def maxDepth(self, root: Optional[TreeNode]) -> int: if not root: return 0 left = self.maxDepth(root.left) right = self.maxDepth(root.right) return max(left,right) + 1 ``` [226. 翻转二叉树](https://leetcode.cn/problems/invert-binary-tree/?envType=study-plan-v2&envId=top-100-liked) ```py class Solution: def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]: if not root: return left = self.invertTree(root.right) right = self.invertTree(root.left) root.left = left root.right = right return root ``` [101.对称二叉树](https://leetcode.cn/problems/symmetric-tree/submissions/577240270/?envType=study-plan-v2&envId=top-100-liked) ```py class Solution: def check(self, L, R): if not L and not R: return True if not L or not R or L.val != R.val: return False return self.check(L.left, R.right) and self.check(L.right, R.left) def isSymmetric(self, root: Optional[TreeNode]) -> bool: return self.check(root.left, root.right) ``` [543.二叉树的直径](https://leetcode.cn/problems/diameter-of-binary-tree/?envType=study-plan-v2&envId=top-100-liked) ```py class Solution: def diameterOfBinaryTree(self, root: Optional[TreeNode]) -> int: self.res = 0 def dfs(root): if not root: return 0 left = dfs(root.left) right = dfs(root.right) self.res = max(self.res, left + right) return max(left, right) + 1 dfs(root) return self.res ``` [*102.二叉树的层序遍历](https://leetcode.cn/problems/binary-tree-level-order-traversal/?envType=study-plan-v2&envId=top-100-liked) ```py class Solution: def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]: q = deque() res = [] if not root: return [] q.append(root) while q: size = len(q) cur = [] for _ in range(size): node = q.popleft() if node.left: q.append(node.left) if node.right: q.append(node.right) cur.append(node.val) res.append(cur) return res ``` [108. 将有序数组转换为二叉搜索树](https://leetcode.cn/problems/convert-sorted-array-to-binary-search-tree/?envType=study-plan-v2&envId=top-100-liked) ```py class Solution: def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]: n = len(nums) if n == 0: return None mid = n // 2 root = TreeNode(nums[mid]) root.left = self.sortedArrayToBST(nums[:mid]) root.right = self.sortedArrayToBST(nums[mid+1:]) return root ``` [98. 验证二叉搜索树](https://leetcode.cn/problems/validate-binary-search-tree/?envType=study-plan-v2&envId=top-100-liked) ```py class Solution: def isValidBST(self, root: Optional[TreeNode]) -> bool: res = [] def dfs(node): if not node: return dfs(node.left) res.append(node.val) dfs(node.right) dfs(root) n = len(res) if n < 2: return True for i in range(1,n): if res[i] <= res[i-1]: return False return True ``` ```python class Solution: def isValidBST(self, root: Optional[TreeNode]) -> bool: def helper(node, low = float('-inf'), high = float('inf')): if not node: return True if node.val <= low or node.val >= high: return False return helper(node.left, low, node.val) and helper(node.right, node.val, high) return helper(root) ``` [230. 二叉搜索树中第 K 小的元素](https://leetcode.cn/problems/kth-smallest-element-in-a-bst/?envType=study-plan-v2&envId=top-100-liked) ```py class Solution: def kthSmallest(self, root: Optional[TreeNode], k: int) -> int: res = [] def dfs(root): if not root: return dfs(root.left) res.append(root.val) dfs(root.right) dfs(root) return res[k-1] ``` [199. 二叉树的右视图](https://leetcode.cn/problems/binary-tree-right-side-view/?envType=study-plan-v2&envId=top-100-liked) ```py class Solution: def rightSideView(self, root: Optional[TreeNode]) -> List[int]: res = [] q = deque() if not root: return [] q.append(root) while q: size = len(q) cur = [] for _ in range(size): node = q.popleft() if node.left: q.append(node.left) if node.right: q.append(node.right) cur.append(node.val) res.append(cur[-1]) return res ``` [114. 二叉树展开为链表](https://leetcode.cn/problems/flatten-binary-tree-to-linked-list/submissions/580699432/?envType=study-plan-v2&envId=top-100-liked) ```py class Solution: def flatten(self, root: Optional[TreeNode]) -> None: """ Do not return anything, modify root in-place instead. """ if not root: return [] self.flatten(root.left) self.flatten(root.right) temp = root.right root.right = root.left root.left = None cur = root while cur.right: cur = cur.right cur.right = temp ``` [105. 从前序与中序遍历序列构造二叉树](https://leetcode.cn/problems/construct-binary-tree-from-preorder-and-inorder-traversal/?envType=study-plan-v2&envId=top-100-liked) ```py class Solution: def buildTree(self, preorder: List[int], inorder: List[int]) -> Optional[TreeNode]: if not preorder: return None root = TreeNode(preorder[0]) idx = inorder.index(preorder[0]) root.left = self.buildTree(preorder[1:idx+1], inorder[:idx]) root.right = self.buildTree(preorder[idx+1:], inorder[idx+1:]) return root ``` [437. 路径总和 III](https://leetcode.cn/problems/path-sum-iii/?envType=study-plan-v2&envId=top-100-liked) ```py class Solution: def pathSum(self, root: Optional[TreeNode], targetSum: int) -> int: dic = {0: 1} self.res = 0 def dfs(root, cur_sum): if not root: return cur_sum += root.val self.res += dic.get(cur_sum - targetSum, 0) dic[cur_sum] = dic.get(cur_sum, 0) + 1 dfs(root.left, cur_sum) dfs(root.right, cur_sum) dic[cur_sum] -= 1 dfs(root, 0) return self.res ``` [236. 二叉树的最近公共祖先](https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/?envType=study-plan-v2&envId=top-100-liked) ```py class Solution: def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode': if root in (None, p, q): return root left = self.lowestCommonAncestor(root.left, p, q) right = self.lowestCommonAncestor(root.right, p, q) if left and right: return root if left: return left else: return right ``` [124. 二叉树中的最大路径和](https://leetcode.cn/problems/binary-tree-maximum-path-sum/?envType=study-plan-v2&envId=top-100-liked) ```py class Solution: def maxPathSum(self, root: Optional[TreeNode]) -> int: ans = -inf def dfs(root): if not root: return 0 nonlocal ans l_val = dfs(root.left) r_val = dfs(root.right) ans = max(ans, l_val + r_val + root.val) # dfs函数的核心目的是算出每个节点对其上层节点所在路径能提供的最大贡献 return max(max(l_val, r_val) + root.val, 0) dfs(root) return ans ```
嘉心糖糖
2025年8月9日 16:45
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档(打印)
分享
链接
类型
密码
更新密码