
二叉树篇_刷题笔记
文章平均质量分 81
潮_
专注算法解题(转载自力扣@灵茶山艾府),python开发,面试八股分享,自动化测试(转载自@白月黑羽)
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
二叉树题解——二叉搜索树中第 K 小的元素【LeetCode】使用外部变量ans记录答案
利用 BST 的中序遍历特性,使节点值按升序访问,倒数计数直到第 k 个元素,即为结果。✅ 利用了 BST 的有序性,不需要额外排序;✅ 通过中序遍历直接按顺序找到第 k 个元素;✅ 使用k == 0作为提前剪枝条件,节省时间;✅ 用nonlocal管理共享变量,递归写法清晰优雅。原创 2025-07-05 13:56:12 · 402 阅读 · 0 评论 -
二叉树题解——验证二叉搜索树【LeetCode】后序遍历
后序遍历地收集每棵子树的最值信息,同时判断当前节点是否满足 BST 性质。✅ 通过最小/最大值来传递合法性,思路独特;✅ 利用作为非法标志,避免使用全局变量;✅ 后序遍历先处理左右子树,再判断当前节点,能做到“非法剪枝”;✅ 可扩展性强:该模式也可以改写为同时处理 AVL 树、红黑树的平衡性检测等。# 也可以在递归完左子树之后立刻判断,如果发现不是二叉搜索树,就不用递归右子树了= inf本算法通过后序遍历传递(最小值, 最大值)原创 2025-07-04 18:15:23 · 323 阅读 · 0 评论 -
二叉树题解——验证二叉搜索树【LeetCode】前序遍历
递归地对每个节点维护上下边界区间,判断其值是否符合 BST 的定义,并递归验证左右子树。✅ 采用“值域约束”方式,严格验证 BST 的定义✅ 上下界会随着递归深入而收紧,更精确限制节点取值✅ 非常适合处理“全局性条件”的验证场景,如 BST 中的跨层约束✅ 简洁高效,是判断 BST 有效性的经典做法本算法通过上下界约束方式递归判断每个节点是否符合 BST 条件,时间复杂度 O(n),空间复杂度 O(h),是判断有效二叉搜索树的最经典、最推荐方案之一。原创 2025-07-04 13:58:15 · 327 阅读 · 0 评论 -
二叉树题解——将有序数组转换为二叉搜索树【LeetCode】优化解法
分治 + 递归思想,选中点为根节点,递归构建左右子树,保持树的高度平衡。✅ 使用数组中点作为当前子树的根节点,有效保证平衡性;✅ 不断分割区间构建左右子树,天然匹配树的结构;✅ 用索引代替切片,避免多余内存开销;✅ 是将“数组 → 树结构”的典型构造模板。本算法通过分治递归+中点选根策略,在 O(n) 时间、O(log n) 空间内将有序数组构造成一棵平衡的 BST,是数组转树结构的经典构造技巧。利用递归 + 数组切片 + 中点选根策略,构造高度平衡的 BST。原创 2025-07-04 09:41:32 · 1217 阅读 · 0 评论 -
二叉树题解——将有序数组转换为二叉搜索树【LeetCode】传统解法
选择任意一个中间位置数字作为根节点,则根节点的下标为 mid=(left+right)/2 和 mid=(left+right+1)/2 两者中随机选择一个,此处的除法为整数除法。选择中间位置右边的数字作为根节点,则根节点的下标为 mid=(left+right+1)/2,此处的除法为整数除法。选择中间位置左边的数字作为根节点,则根节点的下标为 mid=(left+right)/2,此处的除法为整数除法。原创 2025-07-04 09:22:55 · 580 阅读 · 0 评论 -
二叉树题解——二叉树的层序遍历【LeetCode】队列实现
利用deque实现队列结构,避免了列表pop(0)带来的性能损耗。✅popleft()是 O(1) 时间复杂度;✅能精确处理一层;✅ 代码结构更标准、更高效,更适合大型数据量的广度优先遍历。return []ans = []while q:vals = []return ans该队列版层序遍历通过deque优化了队列操作,是广度优先搜索在树结构上的最标准实现,在 O(n) 时间和 O(n) 空间复杂度下,稳定、高效、易读,是生产代码中常用的 BFS 模板之一。原创 2025-07-03 20:44:56 · 354 阅读 · 0 评论 -
二叉树题解——二叉树的层序遍历【LeetCode】数组实现
本算法的核心是:使用广度优先遍历(BFS),每次处理一整层,借助两个列表cur和nxt来模拟队列层层推进。✅ 不使用或,但逻辑上一样;cur(当前层),nxt(下一层),vals(记录值);✅ 是 BFS 在树结构上的最标准用法之一。return []ans = []while cur:nxt = []vals = []cur = nxtreturn ans该算法通过cur/nxt。原创 2025-07-03 20:44:20 · 358 阅读 · 0 评论 -
二叉树题解——二叉树的直径【LeetCode】
*“直径”**指的是树中任意两个节点之间最长的路径长度;路径长度指的是边的数量,即经过的节点数 - 1。以node为根的子树的最大深度,核心是后序遍历。利用后序遍历,求出每个节点左、右子树深度,并尝试用L + R + 1更新最大路径节点数。✅ 通过每个节点作为路径“中间点”,记录“穿过该节点的最长路径”;✅ 所有这样的路径中最长者就是二叉树的直径;✅ 最终减去 1 就得到边数形式的直径长度。self.ans = 1 # 初始化结果为 1# 访问到空节点了,返回 0return -1。原创 2025-07-03 09:45:53 · 555 阅读 · 0 评论 -
二叉树题解——对称二叉树【LeetCode】
dfs(p, q)比较两个节点p和q代表的子树是否对称。将树的“对称性”问题转化为“两个子树是否镜像”的判断,并使用递归双指针同步对比两棵子树的结构与值。✅ 双指针pq分别走向左、右子树的“对称位置”;✅ 比较顺序是 “左对右,右对左”,从而形成“镜像”判定;✅ 本质是结构和数值都一致的镜像匹配问题。if not (p or q): # 都是空节点if not (p and q): # 只有一个为空,不对称if p.val!= q.val: # 值不等,不对称# 递归判断:左对右,右对左。原创 2025-07-02 00:30:00 · 455 阅读 · 0 评论 -
二叉树题解——翻转二叉树【LeetCode】
整个算法从叶子节点向上,逐步完成左右子树的交换。每个节点都做“翻转自己的左右子树”这一件事,由递归统一调度,最终完成整棵树的翻转。这段代码的核心思想是:使用后序遍历的递归方式,自底向上交换每个节点的左右子树。✅ 后序遍历是关键:必须先处理完子树,再交换;✅ 每个节点只处理一次,处理内容就是“递归子树 + 左右互换”;✅ 属于结构清晰、直觉明确的树形递归模板。return root # 如果当前节点为空,直接返回# 递归翻转左子树和右子树# 交换左右子树# 返回翻转后的当前节点。原创 2025-07-02 00:15:00 · 294 阅读 · 0 评论 -
二叉树题解——二叉树的最大深度【LeetCode】两种方法实现
最大深度是指从根节点到最远叶子节点的最长路径上的节点数。递归地计算左右子树的最大深度,然后返回“更深的一侧 + 当前层”作为整体深度。这是一个典型的后序遍历问题,因为只有等左右子树处理完毕后,才能计算当前节点的高度。这两个递归实现都通过“后序遍历 + 层高累计”的方式求解二叉树最大深度。一个精简直接、一个易读明确,本质相同,都是标准的二叉树深度问题递归写法,时间和空间复杂度均为线性级别。每一轮 while 循环处理一层节点,处理完后就将深度 +1,最终的层数就是最大深度。原创 2025-07-01 13:27:18 · 983 阅读 · 0 评论 -
二叉树题解——二叉树的中序遍历【LeetCode】颜色标记法
通过颜色状态模拟递归流程,显式管理“节点处理的阶段”,从而完成中序遍历。相比传统的栈模拟或统一写法,它具有以下优势:✅ 清晰区分每个节点的处理阶段(未访问 / 待访问);✅ 适用于中序 / 前序 / 后序统一写法,仅需调整压栈顺序;✅ 可用于复杂场景(如前序+后序同时记录、构建表达式树等)。WHITE, GRAY = 0, 1 # 定义颜色常量res = [] # 结果列表stack = [(WHITE, root)] # 初始化栈,根节点以 WHITE 状态压入。原创 2025-07-01 13:18:16 · 386 阅读 · 0 评论 -
二叉树题解——二叉树的中序遍历【LeetCode】统一写法版本
将访问节点值与处理子节点的过程“解耦”,用类型判断区分是否“已展开”。✅ 借助栈顺序控制访问流程;✅ 用来判断当前栈元素是否是“待处理节点”;✅ 中序遍历通过压入[右子树, 当前值, 左子树]的顺序来模拟递归。这种技巧具有很高的统一性和可拓展性,适用于中序、前序、后序的迭代实现,只需要改变压栈顺序。stack, rst = [root], [] # 初始化栈和结果列表i = stack.pop() # 弹出栈顶元素# 按照中序遍历的顺序,将右子节点、节点值、左子节点依次压入栈。原创 2025-07-01 13:18:03 · 661 阅读 · 0 评论 -
二叉树篇——python.刷题记录
选择任意一个中间位置数字作为根节点,则根节点的下标为 mid=(left+right)/2 和 mid=(left+right+1)/2 两者中随机选择一个,此处的除法为整数除法。根据前序数组第一个元素,拼出根节点,再将前序数组和中序数组分成两半,递归的处理前序数组左边和中序数组左边,递归的处理前序数组右边和中序数组右边。前序数组的 左子树部分+根节点 是 1,2,4,5,中序数组的 左子树部分+根节点 是 4,2,5,1。的长度,说明当前节点是这一层首次遇到的节点(即最右边的节点),将其加入。原创 2025-04-14 18:02:23 · 796 阅读 · 0 评论