Hot100:二叉树的直径(Diameter of Binary Tree)树形 DP / 高度回传 ACERS 解析

副标题 / 摘要 LeetCode 543 最容易混乱的点是:递归函数到底应该返回“高度”还是“直径”。这题的稳定写法是后序遍历时向上返回高度,同时在每个节点尝试更新“经过当前节点的最长路径”。理解这个分工后,树形 DP 会一下子清楚很多。 预计阅读时长:10~13 分钟 标签:Hot100、二叉树、树形DP、DFS、后序遍历 SEO 关键词:Diameter of Binary Tree, 二叉树的直径, 树形DP, 高度回传, DFS, LeetCode 543 元描述:系统讲透 LeetCode 543 的后序高度回传法,包含递推推导、工程迁移、复杂度分析与多语言实现。 A — Algorithm(题目与算法) 题目还原 给你一棵二叉树的根节点 root,返回该树的直径。 二叉树的直径指的是: 树中任意两个节点之间最长路径的长度 这条路径可以经过根节点,也可以不经过根节点 路径长度按边数计算 输入输出 名称 类型 描述 root TreeNode 二叉树根节点 返回 int 树的直径(最长路径边数) 示例 1 输入:root = [1,2,3,4,5] 输出:3 解释:长度为 3 ,取路径 [4,2,1,3] 或 [5,2,1,3] 。 示例 2 输入:root = [1,2] 输出:1 提示 树中节点数目在范围 [1, 10^4] 内 -100 <= Node.val <= 100 目标读者 已经会写树深度递归,准备进入树形 DP 视角的学习者 容易把“返回值”和“全局答案”混在一起的开发者 在工程里处理层级传播链、最长链路或树状结构跨度问题的工程师 背景 / 动机 看到“二叉树的直径”,很多人第一反应会是: ...

2026年4月19日 · 7 分钟 · map[name:Jeanphilo]

Hot100:二叉树的最近公共祖先(Lowest Common Ancestor of a Binary Tree)后序返回值语义 ACERS 解析

副标题 / 摘要 LeetCode 236 的真正难点不是“记住 LCA 模板”,而是先定义清楚:递归函数到底要向父节点返回什么信息。只要这个返回值语义稳定,整题就会自然落成一段非常短但非常强的后序递归。 预计阅读时长:11~14 分钟 标签:Hot100、二叉树、LCA、DFS、后序遍历 SEO 关键词:Lowest Common Ancestor of a Binary Tree, 二叉树的最近公共祖先, LCA, 后序遍历, DFS, LeetCode 236 元描述:系统讲透 LeetCode 236 的后序返回值定义、节点自祖先规则、递归推导过程、工程迁移和多语言实现。 A — Algorithm(题目与算法) 题目还原 给定一棵二叉树,找到该树中两个指定节点 p 和 q 的最近公共祖先。 最近公共祖先(LCA)的定义是: x 同时是 p 和 q 的祖先 在满足上面条件的节点里,x 的深度尽可能大 一个节点也可以是它自己的祖先 输入输出 名称 类型 描述 root TreeNode 二叉树根节点 p, q TreeNode 树中的两个指定节点;示例输入里用它们的唯一值表示 返回 TreeNode p 和 q 的最近公共祖先 示例 1 输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1 输出:3 解释:节点 5 和节点 1 的最近公共祖先是节点 3 。 示例 2 输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4 输出:5 解释:节点 5 和节点 4 的最近公共祖先是节点 5 。因为根据定义最近公共祖先节点可以为节点本身。 示例 3 输入:root = [1,2], p = 1, q = 2 输出:1 提示 树中节点数目在范围 [2, 10^5] 内 -10^9 <= Node.val <= 10^9 所有 Node.val 互不相同 p != q p 和 q 均存在于给定的二叉树中 目标读者 已经会写普通树递归,但一到“最近公共祖先”就容易卡在返回值定义上的学习者 想把后序分治写法固定成稳定模板的开发者 在工程里处理组织树、组件树、目录树共享祖先问题的工程师 背景 / 动机 很多人第一次做 236,会下意识想到: ...

2026年4月19日 · 8 分钟 · map[name:Jeanphilo]

Hot100:验证二叉搜索树(Validate Binary Search Tree)区间约束 / 中序判序 ACERS 解析

副标题 / 摘要 LeetCode 98 最容易写错的地方,不是“不会递归”,而是误以为每个节点只要和自己的父节点比较就够了。真正的 BST 校验要把祖先留下来的上下界一路向下传递。本文按 ACERS 结构把这个不变量讲透,再补上中序遍历判序的等价视角。 预计阅读时长:11~14 分钟 标签:Hot100、二叉树、BST、DFS、中序遍历 SEO 关键词:Validate Binary Search Tree, 验证二叉搜索树, BST, 区间约束, 中序遍历, LeetCode 98 元描述:系统讲透 LeetCode 98 的区间递归写法与中序递增判定思路,包含推导、工程迁移、多语言实现与高频误区。 A — Algorithm(题目与算法) 题目还原 给你一个二叉树的根节点 root,判断它是否是一棵有效的二叉搜索树(BST)。 有效 BST 需要同时满足: 左子树所有节点值都严格小于当前节点值 右子树所有节点值都严格大于当前节点值 左右子树本身也都必须是 BST 输入输出 名称 类型 描述 root TreeNode 二叉树根节点 返回 bool 是否为有效 BST 示例 1 输入:root = [2,1,3] 输出:true 示例 2 输入:root = [5,1,4,null,null,3,6] 输出:false 解释:根节点的值是 5,但是右子节点的值是 4 。 提示 树中节点数目范围在 [1, 10^4] 内 -2^31 <= Node.val <= 2^31 - 1 目标读者 刷 Hot100,准备把 BST 判断模板彻底固定下来的学习者 会写树递归,但一遇到“全局约束”就容易只写局部判断的开发者 在工程里处理树形有序结构、范围规则树、层级校验逻辑的工程师 背景 / 动机 这题看起来像一题“简单树递归”,但它真正训练的是: ...

2026年4月19日 · 7 分钟 · map[name:Jeanphilo]

Hot100:N 皇后严格增量构建教程

51. N 皇后 最适合用“代码一步一步长出来”的方式学,而不是直接看一个已经想好的模板答案。 这篇教程只保留教学主线:先从最小例子暴露冲突,再写最小 DFS 骨架,先得到第一版正确解,然后一步步优化到列 / 对角线状态版。 题目 n 皇后问题要求在一个 n x n 的棋盘上放置 n 个皇后,使得任意两个皇后都不能互相攻击。 给定整数 n,返回所有不同的放置方案。 每个方案都用一个字符串数组表示,其中: 'Q' 表示皇后 '.' 表示空位 示例 1 输入:n = 4 输出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]] 示例 2 输入:n = 1 输出:[["Q"]] 约束 1 <= n <= 9 一步一步把代码逼出来 Step 1:先看最小能暴露冲突的例子 先只问一个很具体的问题: 放下一个皇后以后,到底麻烦在哪里? 看 n = 4。 假设第 0 行把皇后放在第 1 列。 那么后面的行就不再是“随便找一个空格”了,而是立刻多出三类限制: 第 1 列不能再放 一条左上到右下的对角线不能再放 一条右上到左下的对角线不能再放 这个最小例子已经说明了问题的本质: 我们要按某种固定顺序放置皇后 每做一个选择,都会封锁后面的若干位置 这一版还没有代码。 现在这一版能做到: 看清楚题目的冲突结构 但它还缺: ...

2026年4月19日 · 4 分钟 · map[name:Jeanphilo]

Hot100:分割回文串(Palindrome Partitioning)回溯 + 回文预处理 ACERS 解析

副标题 / 摘要 131. 分割回文串 的难点不是递归本身,而是两个问题要同时想清楚:当前切到了哪里,以及一个候选片段是不是回文。把这两件事拆开,你就能得到“回溯枚举 + 回文表预处理”的稳定写法。 预计阅读时长:15~18 分钟 标签:Hot100、回溯、字符串、回文、DP SEO 关键词:Palindrome Partitioning, 分割回文串, 回溯, 回文预处理, DP 元描述:通过 LeetCode 131 理解字符串分割型回溯与回文区间预处理,掌握“先判合法片段,再递归切后缀”的题目模型。 A — Algorithm(题目与算法) 题目还原 给定一个字符串 s,请把它切分成若干个子串,使得每个子串都是回文串,并返回所有可能的切分方案。 输入输出 名称 类型 描述 s string 只包含小写英文字母的字符串 返回 string[][] 所有合法的回文切分方案 示例 1 输入:s = "aab" 输出:[["a","a","b"],["aa","b"]] 示例 2 输入:s = "a" 输出:[["a"]] 约束 1 <= s.length <= 16 s 仅由小写英文字母组成 目标读者 已经学过 78/90 这类数组回溯,准备进入“字符串切分型回溯”的学习者 会写递归,但总把“切分位置”和“合法性检查”搅在一起的开发者 想掌握“先预处理合法区间,再枚举切分”的工程迁移套路的读者 背景 / 动机 这题非常适合帮你建立一种更通用的模型: 先判断哪些区间是合法片段,再递归地把整个串切完。 如果你只是把它看成“回文题”,容易只盯着 isPalindrome()。 但如果你把它看成“字符串分割题”,就会更清楚它的结构: ...

2026年4月19日 · 10 分钟 · map[name:Jeanphilo]

Hot100:电话号码的字母组合(Letter Combinations of a Phone Number)固定层数 DFS ACERS 解析

副标题 / 摘要 这题表面上像字符串题,实质上是一个非常标准的固定层数回溯模型:第 k 层只处理第 k 个数字,从其映射字母里选一个,直到路径长度等于输入长度。 预计阅读时长:10~12 分钟 标签:Hot100、回溯、字符串、DFS SEO 关键词:Letter Combinations of a Phone Number, 电话号码的字母组合, 回溯, DFS 元描述:用 LeetCode 17 建立固定层数 DFS 模板,理解字符映射、路径长度终止与多语言实现。 A — Algorithm(题目与算法) 题目还原 给定一个仅由数字 2 到 9 组成的字符串 digits,返回它能表示的所有字母组合。 答案顺序不限。数字与字母的映射与电话按键一致,1 不对应任何字母。 输入输出 名称 类型 描述 digits string 由 2 到 9 组成的数字串 返回 string[] 所有可能的字母组合 示例 1 输入:digits = "23" 输出:["ad","ae","af","bd","be","bf","cd","ce","cf"] 示例 2 输入:digits = "2" 输出:["a","b","c"] 提示 1 <= digits.length <= 4 digits[i] 是范围 ['2', '9'] 内的一个数字 目标读者 已经掌握 78 / 46,准备看另一类回溯树形态的学习者 想把“每层处理一个位置”这种 DFS 模型固定下来的开发者 需要做编码扩展、短串生成、候选串组合的工程师 背景 / 动机 这题和子集、排列都不太一样。 ...

2026年4月2日 · 7 分钟 · map[name:Jeanphilo]

Hot100:全排列(Permutations)used[] 状态回溯模板 ACERS 解析

副标题 / 摘要 如果说子集题教你“组合型回溯”的骨架,那么全排列题教你的就是“状态型回溯”的核心:当前位置要选一个还没用过的元素,直到路径长度等于 n 才收集答案。 预计阅读时长:10~12 分钟 标签:Hot100、回溯、全排列、DFS SEO 关键词:Permutations, 全排列, 回溯, used, DFS 元描述:通过 LeetCode 46 固定排列型回溯模板,重点理解 used[]、叶子收集与多语言实现。 A — Algorithm(题目与算法) 题目还原 给定一个不含重复数字的数组 nums,返回它的所有可能全排列。 答案顺序不限。 输入输出 名称 类型 描述 nums int[] 不含重复元素的整数数组 返回 int[][] 所有可能的全排列 示例 1 输入:nums = [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] 示例 2 输入:nums = [0,1] 输出:[[0,1],[1,0]] 示例 3 输入:nums = [1] 输出:[[1]] 提示 1 <= nums.length <= 6 -10 <= nums[i] <= 10 nums 中所有整数互不相同 目标读者 已经做完 78. 子集,准备进入排列型回溯的学习者 会写递归,但状态恢复经常出错的开发者 需要枚举任务执行顺序、测试顺序或操作序列的工程师 背景 / 动机 排列问题和组合问题最本质的区别是: ...

2026年4月2日 · 6 分钟 · map[name:Jeanphilo]

Hot100:组合总和(回溯 / 剪枝 / 可重复选取)ACERS 解析

副标题 / 摘要 组合总和是 Hot100 回溯阶段里第一道真正把“组合模板 + 目标约束 + 排序剪枝”揉在一起的题。你不应该直接背结论,而应该顺着问题一步步推出:为什么要有 path,为什么要有 remain,为什么下一层仍然从 i 开始。 预计阅读时长:14~16 分钟 标签:Hot100、回溯、组合、剪枝 SEO 关键词:Combination Sum, 组合总和, 回溯, 剪枝, remain, DFS 元描述:通过 LeetCode 39 建立组合型回溯加剪枝模板,理解可重复选取、remain 语义与排序后的安全剪枝。 A — Algorithm(题目与算法) 题目还原 给定一个无重复元素的整数数组 candidates 和一个目标整数 target, 找出 candidates 中所有可以使数字和为 target 的不同组合,并以列表形式返回。 你可以无限次选取同一个候选数字。 如果两个组合中某个数字出现次数不同,则它们被视为不同组合。 输入输出 名称 类型 描述 candidates int[] 无重复元素的候选数组 target int 目标和 返回 int[][] 所有和为 target 的不同组合 示例 1 输入:candidates = [2,3,6,7], target = 7 输出:[[2,2,3],[7]] 示例 2 输入:candidates = [2,3,5], target = 8 输出:[[2,2,2,2],[2,3,3],[3,5]] 示例 3 输入:candidates = [2], target = 1 输出:[] 约束 1 <= candidates.length <= 30 2 <= candidates[i] <= 40 candidates 中所有元素互不相同 1 <= target <= 40 官方保证满足条件的不同组合数少于 150 目标读者 已经做过 78. 子集,现在准备学习“带目标约束”的回溯写法 知道回溯大概长什么样,但一碰到“数字可重复选取”就容易写错边界的学习者 想把这题真正写成模板,而不是只记住 dfs(i, remain - x) 这一行的开发者 背景 / 动机 39. 组合总和 很适合作为回溯第二阶段的训练题,因为它让你同时处理三件事: ...

2026年4月2日 · 8 分钟 · map[name:Jeanphilo]

Hot100:二叉树的层序遍历(Binary Tree Level Order Traversal)BFS / DFS ACERS 解析

副标题 / 摘要 层序遍历是二叉树 BFS 模板的起点。真正关键的不是“用队列”,而是“如何把同一层的节点切分出来”。本文按 ACERS 结构拆解 LeetCode 102 的按层处理方法、DFS 深度分桶备选方案,以及工程里常见的分层遍历场景。 预计阅读时长:10~12 分钟 标签:Hot100、二叉树、BFS、DFS、队列、层序遍历 SEO 关键词:Hot100, Binary Tree Level Order Traversal, 二叉树的层序遍历, BFS, 队列, LeetCode 102 元描述:系统讲透 LeetCode 102 的层序 BFS、层宽控制与 DFS 深度分桶思路,并延伸到组织树、菜单树和波次执行等工程场景。 目标读者 想把 BFS 模板真正固定下来的 Hot100 刷题读者 会普通遍历,但一到“按层输出”就容易把层边界写乱的开发者 需要按深度分组展示树形结构的工程师 背景 / 动机 LeetCode 102 是树题里最标准的 BFS 入门题之一。 它训练的不是“遍历所有节点”,而是两件更重要的事: 如何用队列维护“下一批待处理节点” 如何准确切出“这一层”和“下一层”的边界 很多 BFS bug 都来自这里: 在遍历当前层时直接用不断变化的 queue.length 一边弹当前层,一边把新孩子混进当前层结果 忘记空树处理,导致访问空指针 把 102 的模板写稳,后面的: 右视图 每层平均值 锯齿层序遍历 最小深度 / 最大深度的 BFS 写法 都会自然很多。 ...

2026年3月15日 · 8 分钟 · map[name:Jeanphilo]

Hot100:对称二叉树(Symmetric Tree)镜像递归 / BFS ACERS 解析

副标题 / 摘要 对称二叉树的难点不在遍历,而在“比较方向”。你比较的不是左对左、右对右,而是镜像位置上的节点对。本文按 ACERS 结构拆解 LeetCode 101 的镜像递归合同、BFS 成对入队写法,以及工程中的对称结构校验场景。 预计阅读时长:10~12 分钟 标签:Hot100、二叉树、DFS、BFS、对称性 SEO 关键词:Hot100, Symmetric Tree, 对称二叉树, 镜像递归, BFS, LeetCode 101 元描述:系统讲透 LeetCode 101 的镜像递归与 BFS 对称校验思路,并延伸到布局树与拓扑模板的对称检查。 目标读者 刚从 100 相同的树过渡到“镜像比较”的刷题读者 会写普通树递归,但对“外侧 / 内侧”比较关系容易写乱的开发者 需要在布局树、模板树、镜像结构里做左右对称校验的工程师 背景 / 动机 LeetCode 101 很适合作为树题里的“方向感”训练: 你要先意识到,对称不是“左右子树完全一样” 它要求的是“左边看过去”和“右边镜像过来”之后一致 也就是说,比较方向从“同向”变成了“交叉” 很多人做这题时容易犯三类错误: 还沿用 100 的思路,写成 left.left 对 right.left 只比较节点值,不比较空节点位置 先翻转一棵子树再比较,结果多做了一轮变换,逻辑也更绕 这题真正训练的是“镜像递归模板”。掌握后,树对称、树镜像、结构匹配等题都会更清楚。 核心概念 镜像关系:左子树的左边,要和右子树的右边对应;左子树的右边,要和右子树的左边对应 外侧 / 内侧配对:left.left 对 right.right,left.right 对 right.left 成对递归:递归函数参数是两个节点,表示“这两个位置是否互为镜像” 成对入队:BFS 里队列保存的不是单个节点,而是需要一起比较的节点对 A — Algorithm(题目与算法) 题目还原 给你一个二叉树的根节点 root,检查它是否轴对称。 ...

2026年3月15日 · 7 分钟 · map[name:Jeanphilo]