<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>DFS on Jeanphilo Blog</title><link>https://jeanphilogong.github.io/jeanblog/zh/tags/dfs/</link><description>Recent content in DFS on Jeanphilo Blog</description><generator>Hugo -- 0.168.0</generator><language>zh-cn</language><lastBuildDate>Wed, 27 May 2026 00:00:00 +0800</lastBuildDate><atom:link href="https://jeanphilogong.github.io/jeanblog/zh/tags/dfs/index.xml" rel="self" type="application/rss+xml"/><item><title>LeetCode 547：省份数量，把邻接矩阵看成图的连通分量</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/547-number-of-provinces/</link><pubDate>Wed, 27 May 2026 00:00:00 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/547-number-of-provinces/</guid><description>从邻接矩阵的直接连接关系出发，把 LeetCode 547 省份数量转成无向图连通分量计数问题，再逐步推出 DFS、BFS 和并查集解法。</description></item><item><title>LeetCode 78：子集，从搜索树推出 startIndex 回溯模板</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/backtracking/78-subsets/</link><pubDate>Sun, 03 May 2026 14:25:07 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/backtracking/78-subsets/</guid><description>&lt;h2 id="题目要求"&gt;题目要求&lt;/h2&gt;
&lt;h3 id="输入输出"&gt;输入输出&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;输入：&lt;code&gt;nums&lt;/code&gt;，长度 &lt;code&gt;1 &amp;lt;= nums.length &amp;lt;= 10&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;元素范围：&lt;code&gt;-10 &amp;lt;= nums[i] &amp;lt;= 10&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;所有元素互不相同&lt;/li&gt;
&lt;li&gt;输出：返回 &lt;code&gt;nums&lt;/code&gt; 的所有可能子集&lt;/li&gt;
&lt;li&gt;顺序：结果顺序不限，子集内部不需要考虑排列顺序&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="示例"&gt;示例&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;输入：nums = [1,2,3]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;输出：[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这篇只用 Python 构造一个最小可运行解法。&lt;/p&gt;
&lt;h2 id="从-12-的搜索树开始"&gt;从 &lt;code&gt;[1,2]&lt;/code&gt; 的搜索树开始&lt;/h2&gt;
&lt;p&gt;最小但有分叉的例子是：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nums = [1,2]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;答案应该是：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[], [1], [1,2], [2]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;注意这里没有 &lt;code&gt;[2,1]&lt;/code&gt;。这说明问题不是“随便排列所有选择”，而是“每个元素选或不选，且同一组元素只出现一次”。&lt;/p&gt;
&lt;p&gt;如果把构造过程画成树：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;|- [1]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| |- [1,2]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;|- [2]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这棵树暴露出两个事实：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;每个节点都是一个合法子集。&lt;/li&gt;
&lt;li&gt;进入 &lt;code&gt;[1]&lt;/code&gt; 之后，后面只能继续看 &lt;code&gt;2&lt;/code&gt;，不能回头再选 &lt;code&gt;1&lt;/code&gt; 或生成 &lt;code&gt;[2,1]&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="step-1先说清楚一个递归层在解决什么"&gt;Step 1：先说清楚一个递归层在解决什么&lt;/h2&gt;
&lt;p&gt;如果当前已经选出一个 &lt;code&gt;path&lt;/code&gt;，剩下的问题是：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;从某个起点之后的元素里，继续选择若干个元素，扩展当前 &lt;code&gt;path&lt;/code&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这个“某个起点”必须被记下来。否则 &lt;code&gt;[1,2]&lt;/code&gt; 和 &lt;code&gt;[2,1]&lt;/code&gt; 会从不同路径重复出现。&lt;/p&gt;
&lt;p&gt;先写最小骨架。它只保留两个状态：&lt;/p&gt;</description></item><item><title>Hot100：二叉树中的最大路径和（Binary Tree Maximum Path Sum）树形 DP / 单边贡献 ACERS 解析</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/binary-tree/124-binary-tree-maximum-path-sum/</link><pubDate>Mon, 20 Apr 2026 09:37:25 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/binary-tree/124-binary-tree-maximum-path-sum/</guid><description>围绕 LeetCode 124 讲清最大路径和的关键设计：递归向上只返回单边贡献，而经过当前节点的完整路径用来更新全局答案。</description></item><item><title>Hot100：二叉树的直径（Diameter of Binary Tree）树形 DP / 高度回传 ACERS 解析</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/binary-tree/543-diameter-of-binary-tree/</link><pubDate>Sun, 19 Apr 2026 14:52:28 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/binary-tree/543-diameter-of-binary-tree/</guid><description>围绕 LeetCode 543 讲清二叉树直径的核心：递归返回高度、在当前节点更新全局直径，以及为什么最长路径不一定只看根到叶。</description></item><item><title>Hot100：二叉树的最近公共祖先（Lowest Common Ancestor of a Binary Tree）后序返回值语义 ACERS 解析</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/binary-tree/236-lowest-common-ancestor-of-a-binary-tree/</link><pubDate>Sun, 19 Apr 2026 14:52:28 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/binary-tree/236-lowest-common-ancestor-of-a-binary-tree/</guid><description>围绕 LeetCode 236 讲清最近公共祖先的后序返回值语义：子树返回什么、什么时候当前节点成为答案、以及为什么节点自己也可以是祖先。</description></item><item><title>Hot100：验证二叉搜索树（Validate Binary Search Tree）区间约束 / 中序判序 ACERS 解析</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/binary-tree/98-validate-binary-search-tree/</link><pubDate>Sun, 19 Apr 2026 14:52:28 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/binary-tree/98-validate-binary-search-tree/</guid><description>围绕 LeetCode 98 讲清 BST 的祖先区间约束、不只和父节点比较的核心原因，以及区间递归与中序判序两种稳定写法。</description></item><item><title>LeetCode 216：组合总和 III（回溯 / 固定长度搜索）ACERS 解析</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/216-combination-sum-iii/</link><pubDate>Fri, 17 Apr 2026 14:31:14 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/216-combination-sum-iii/</guid><description>围绕 LeetCode 216 讲清固定长度组合搜索、1..9 有界候选集与只能使用一次的回溯写法，并从题目本身一步一步推出最终模板。</description></item><item><title>LeetCode 40：组合总和 II（回溯 / 同层去重 / 只能用一次）ACERS 解析</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/40-combination-sum-ii/</link><pubDate>Fri, 17 Apr 2026 14:31:11 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/40-combination-sum-ii/</guid><description>围绕 LeetCode 40 讲清“每个位置只能用一次”与“同层去重”的真正含义，并用一步一步推导的方式建立稳定回溯模板。</description></item><item><title>Hot100：电话号码的字母组合（Letter Combinations of a Phone Number）固定层数 DFS ACERS 解析</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/backtracking/17-letter-combinations-of-a-phone-number/</link><pubDate>Thu, 02 Apr 2026 13:48:57 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/backtracking/17-letter-combinations-of-a-phone-number/</guid><description>围绕 LeetCode 17 讲清固定层数 DFS、数字到字母映射与多语言实现。</description></item><item><title>Hot100：全排列（Permutations）used[] 状态回溯模板 ACERS 解析</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/backtracking/46-permutations/</link><pubDate>Thu, 02 Apr 2026 13:48:57 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/backtracking/46-permutations/</guid><description>围绕 LeetCode 46 全排列，讲清 used[] 状态控制、叶子收集答案与多语言实现。</description></item><item><title>Hot100：组合总和（回溯 / 剪枝 / 可重复选取）ACERS 解析</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/backtracking/39-combination-sum/</link><pubDate>Thu, 02 Apr 2026 13:48:57 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/backtracking/39-combination-sum/</guid><description>围绕 LeetCode 39 讲清组合型回溯、可重复选取、remain 状态与排序剪枝，并用一步一步构建代码的方式把模板真正学会。</description></item><item><title>克隆图：哈希表 + DFS/BFS 实现无向图深拷贝（LeetCode 133）</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/133-clone-graph/</link><pubDate>Thu, 19 Mar 2026 13:18:26 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/133-clone-graph/</guid><description>用原节点到新节点的映射表实现无向连通图深拷贝，覆盖 DFS 与 BFS 两种写法、环处理、正确性分析与多语言可运行实现。</description></item><item><title>Hot100：二叉树的层序遍历（Binary Tree Level Order Traversal）BFS / DFS ACERS 解析</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/binary-tree/102-binary-tree-level-order-traversal/</link><pubDate>Sun, 15 Mar 2026 21:29:44 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/binary-tree/102-binary-tree-level-order-traversal/</guid><description>讲透 LeetCode 102 的按层 BFS、层宽控制与 DFS depth bucket 备选方案，附工程迁移和多语言实现。</description></item><item><title>Hot100：对称二叉树（Symmetric Tree）镜像递归 / BFS ACERS 解析</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/binary-tree/101-symmetric-tree/</link><pubDate>Sun, 15 Mar 2026 21:29:43 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/binary-tree/101-symmetric-tree/</guid><description>围绕 LeetCode 101 讲清镜像递归、BFS 成对入队与树形结构对称校验，附工程迁移和多语言实现。</description></item><item><title>相同的树（Same Tree）同步递归 / BFS ACERS 解析</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/100-same-tree/</link><pubDate>Sun, 15 Mar 2026 21:29:42 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/100-same-tree/</guid><description>围绕 LeetCode 100 讲清同步递归比较、队列成对校验与结构等价判断，附工程迁移与多语言实现。</description></item><item><title>Hot100：二叉树的最大深度（Maximum Depth of Binary Tree）DFS / BFS ACERS 解析</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/binary-tree/104-maximum-depth-of-binary-tree/</link><pubDate>Fri, 06 Mar 2026 17:58:22 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/binary-tree/104-maximum-depth-of-binary-tree/</guid><description>讲透 LeetCode 104 的深度定义、递归 DFS 与层序 BFS 两种主流解法，附工程迁移和多语言实现。</description></item><item><title>Hot100：二叉树的中序遍历（Binary Tree Inorder Traversal）递归 / 显式栈 ACERS 解析</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/binary-tree/94-binary-tree-inorder-traversal/</link><pubDate>Fri, 06 Mar 2026 17:58:21 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/binary-tree/94-binary-tree-inorder-traversal/</guid><description>用左-根-右模板讲透 LeetCode 94，覆盖递归、显式栈与工程迁移场景，附多语言可运行实现。</description></item><item><title>连通分量与强连通分量：Tarjan / Kosaraju 工程 ACERS 解析</title><link>https://jeanphilogong.github.io/jeanblog/zh/dev/algorithm/graph/40-connected-components-and-scc-tarjan-kosaraju/</link><pubDate>Mon, 09 Feb 2026 09:50:22 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/dev/algorithm/graph/40-connected-components-and-scc-tarjan-kosaraju/</guid><description>系统讲解无向图 Connected Components 与有向图 SCC，重点覆盖 Tarjan（工程常用）与 Kosaraju，对应图数据库中的社区划分、子图切分与分片 hint。</description></item><item><title>BFS / DFS 工程入门：k-hop 查询、子图抽取与路径可达性 ACERS 解析</title><link>https://jeanphilogong.github.io/jeanblog/zh/dev/algorithm/graph/10-bfs-dfs-k-hop-subgraph-path-existence/</link><pubDate>Mon, 09 Feb 2026 09:44:11 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/dev/algorithm/graph/10-bfs-dfs-k-hop-subgraph-path-existence/</guid><description>围绕 k-hop 查询、子图抽取、路径可达性三类高频图任务，系统讲清 BFS/DFS 的迭代模板、early stop 剪枝与 visited bitmap/bloom 选型，并附多语言可运行实现。</description></item><item><title>Hot100：路径和 III 前缀和 + 哈希表统计向下路径（LeetCode 437）ACERS 解析</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/binary-tree/437-path-sum-iii/</link><pubDate>Mon, 02 Feb 2026 22:13:45 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/binary-tree/437-path-sum-iii/</guid><description>用前缀和 + 计数哈希表在 O(n) 时间统计二叉树中和为 targetSum 的向下路径数，含推导、工程迁移与多语言实现。</description></item></channel></rss>