二叉树路径总和问题:递归与回溯解法详解
1. 题目到底在问什么从一棵树里找出所有“达标”路径先说清楚这道题的核心诉求给你一棵二叉树再给你一个目标值 targetSum你需要找出所有“从根节点出发到某个叶子节点结束”的路径使得路径上所有节点的值加起来恰好等于 targetSum。最后返回这些路径的完整节点序列。这里有几个容易忽略的隐含条件我建议先写在草稿纸上路径起点必须是根节点终点必须是叶子节点叶子节点就是左右子树都为空的节点。题目问的是“所有满足条件的路径”不是问“有没有”也不是问“有多少条”而是要把每条路径的节点值逐一列出来。二叉树节点的值可能是正数、负数或零这个细节直接影响能不能做剪枝优化后面会专门讲。举个例子假设有下面这棵二叉树5 / \ 4 8 / / \ 11 13 4 / \ / \ 7 2 5 1targetSum 设为 22那么符合条件的路径有两条[5, 4, 11, 2]和[5, 8, 4, 5]。注意[5, 4, 11]不算因为 11 这个节点还有孩子它不是叶子节点[5, 8, 4, 1]的值是 18也和 22 不相等。这道题为什么适合用递归来做因为二叉树本身就是一种天然递归结构一棵树的左子树和右子树各自仍然是一棵独立的二叉树。处理根节点时我只需要把“还差多少”这个信息传递给左右子树让它们各自去完成后续搜索而不需要自己维护一个显式的栈来模拟遍历过程。递归调用栈天然就在帮我们记录“当前走到哪一层”这个状态这一点在树形结构上尤其顺手。很多人在初学递归时会把问题想复杂其实套用经典的“递归三步法”就能理清思路。第一步想清楚终止条件也就是什么时候函数不再往下调用第二步想清楚递归方向也就是我要往哪些子树继续搜索第三步想清楚当前这一层要做什么操作以及是否需要在递归返回后撤销这个操作。对于这道题终止条件是当前节点为空递归方向是左子树和右子树当前操作是把节点值加入路径返回后把节点值从路径中移除。这三步想清楚代码基本就定型了。如果做个生活化类比这道题的搜索过程就像走迷宫时拿着一支笔和一张路线图。每到一个岔路口就在图上记下当前岔口的名字然后先往左边那条路走到底如果这条支路通向出口就把这张图上从起点到当前点的路线誊抄一份如果走到死胡同就把图上最后一个名字擦掉退回来走另一条路。这个“记名字、抄路线、擦名字”的过程对应的就是递归里的“压路径、记结果、回溯”。2. 核心方案选型递归 回溯是怎么配合的这道题的标准解法是“递归 回溯”其实回溯本身并不是什么神秘的技术它就是递归返回之前把状态改回去保证每一层递归看到的公共状态是一致的。这里有两个关键参数值得好好设计一个是当前节点另一个是“剩余目标值”。我习惯把剩余目标值命名为rest。它的含义是从根节点到当前节点的父节点为止路径上所有节点值的总和离 targetSum 还差多少。进入一个节点时用rest减去当前节点的值得到新的rest再传给左右子树。这样设计的好处是判断路径是否满足条件时只需看叶子节点处的rest是否为零不需要额外维护一个“路径总和”变量。路径记录方面需要两个容器一个用来保存当前正在走的路径我一般用类似vectorint path的结构另一个用来保存所有满足条件的结果用vectorvectorint res。path为主线res为结果集。这里必须注意一点path在递归过程中是被反复修改的所以它必须以引用方式传递或者说在支持可变对象的语言里要保证多个递归分支共享同一个path对象。如果按值传递每次递归都会复制一份路径不仅效率低而且回溯操作根本不会作用到原始的path上结果就是路径越走越长、永远清不空。叶子节点判断是整个实现里最容易出错的位置。很多初学者会在rest 0时直接把当前路径加入结果但忽略了当前节点可能根本不是叶子节点。比如说一棵树的根节点值是 5目标值也是 5这时候根节点自身的和已经满足条件了但它还有左子树那么这条“路径”能算一条有效路径吗不能。因为题目要求路径必须以叶子节点结束。所以必须写出if (!node-left !node-right rest 0)这个完整条件三者缺一不可。再来看回溯的具体动作。进入一个节点时先把节点值push_back进path递归完左子树和右子树之后再pop_back()把节点值弹出去。为什么必须弹出去因为path是所有递归分支共享的同一个对象如果不弹出当递归回到上层节点、准备转向右子树时左子树的所有节点还残留在path里右子树的路径就会变成“根节点 左子树节点 根节点 右子树节点”这样的大杂烩结果完全错乱。弹出去这个动作本质上就是“擦掉迷宫图上最后记下的名字”为的是给下一个分支腾出干净的空间。还有一个细节值得展开说找到满足条件的路径后加入结果集时到底要加入什么很多新手的直觉是res.push_back(path)这个写法在 C 里很可能导致后续path被修改时res里刚保存的路径也一起被改掉。拿 C 举例vector是深拷贝的容器res.push_back(path)确实会拷贝一份独立的路径副本所以 C 这样写通常没问题但在 Python 这类引用语义的语言里res.append(path)只是把path的引用放进了结果集后续path.pop()会直接影响结果集里已经“保存”好的路径最后打印结果时你会发现所有路径都变成了同一个空壳。所以 Python 里必须写成res.append(path[:])或res.append(list(path))做一次显式拷贝。这个语言差异我在第四部分还会再提因为它是实际开发里最容易踩的坑。关于剪枝要特别提醒一句如果二叉树节点全是正数那么路径和会随着路径加深单调递增一旦rest已经小于 0就可以提前终止递归这叫剪枝。但如果节点可能存在负数这个剪枝策略就是错的因为后面加上一个负数rest可能又从负数变回 0。面试时最好主动问一句“节点值有没有负数”或者看题目描述里有没有约束如果没有明确说明就不要做基于正数的剪枝只做“节点为空”这个天然终止条件。我画一张简单的过程图手动跑一遍前面那棵样例树帮助你建立递归过程的直觉。从根节点 5 开始rest初始为 22进入根节点后path变为[5]rest变成 17。接着往左走进入节点 4path变为[5, 4]rest变成 13再进入节点 11path变为[5, 4, 11]rest变成 2。节点 11 有左孩子 7 和右孩子 2先走左边进入节点 7path变为[5, 4, 11, 7]rest变成 -5此时节点 7 是叶子节点但rest不是 0所以不记录结果递归返回并弹出 7。然后走右边进入节点 2path变为[5, 4, 11, 2]rest变成 0节点 2 是叶子节点条件满足把这条路径加入结果集随后弹出 2再逐层弹出 11、4回到根节点 5 时path恢复为[5]。接下来走右子树过程类似最终会走到节点 5 和节点 1记录另一条路径[5, 8, 4, 5]。整个过程就是“进栈时压入节点出栈时弹出节点”和函数调用栈的进出完全对应。3. 完整实现与细节剖析这道题我用不同的语言写过很多版最顺手的是 C逻辑最直观性能也可控。下面是完整实现/** * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * }; */ class Solution { public: vectorvectorint pathSum(TreeNode* root, int targetSum) { vectorvectorint res; vectorint path; dfs(root, targetSum, path, res); return res; } private: void dfs(TreeNode* node, int rest, vectorint path, vectorvectorint res) { if (!node) return; path.push_back(node-val); // 当前节点是叶子节点且剩余值恰好为 0 时记录路径 if (!node-left !node-right rest node-val) { res.push_back(path); } dfs(node-left, rest - node-val, path, res); dfs(node-right, rest - node-val, path, res); path.pop_back(); } };细心的读者会发现我的叶子判断写的是rest node-val而不是把rest - node-val传下去后在下一层判断rest 0。这两种写法本质等价但我个人更倾向于在进入节点时直接判断“当前节点的值是否恰好等于剩余的差额”。这样做的好处是少一次无效递归调用——如果当前已经是叶子节点且条件满足就不需要再往左子树和右子树各调一次空递归了。虽然性能差别微乎其微但逻辑上更紧凑也不容易把终止条件想混。Python 版本如下注意结果收集必须用切片拷贝def pathSum(root, targetSum): res [] path [] def dfs(node, rest): if not node: return path.append(node.val) if not node.left and not node.right and rest node.val: res.append(path[:]) # 这里必须拷贝不能直接 append(path) dfs(node.left, rest - node.val) dfs(node.right, rest - node.val) path.pop() dfs(root, targetSum) return resJava 版本和 C 很接近只是容器换成了ListInteger和ListListInteger并且new ArrayList(path)做拷贝class Solution { public ListListInteger pathSum(TreeNode root, int targetSum) { ListListInteger res new ArrayList(); ListInteger path new ArrayList(); dfs(root, targetSum, path, res); return res; } private void dfs(TreeNode node, int rest, ListInteger path, ListListInteger res) { if (node null) return; path.add(node.val); if (node.left null node.right null rest node.val) { res.add(new ArrayList(path)); } dfs(node.left, rest - node.val, path, res); dfs(node.right, rest - node.val, path, res); path.remove(path.size() - 1); } }代码拆开看整个dfs函数就是四句话第一句是终止条件当前节点为空就直接返回第二句是当前操作把节点值压入路径第三句是结果收集满足“叶子 剩余值为零”的条件就拷贝当前路径进结果集第四句是递归与回溯分别往左子树和右子树深入等两棵子树都处理完后再把当前节点从路径里弹出。这四句话顺序不能乱尤其要记住“弹出”操作必须写在两棵子树的递归调用之后而不是写在它们之前。有读者可能会问为什么这个实现不把“叶子节点判断”和“空节点判断”合并比如在进入空节点时判断rest 0然后把path加入结果。这种写法在某些路径问题里可行但这里不行因为空节点可能是某个非叶子节点的左右空子树如果空节点也算一条路径那么根节点 5 在走到左子树的空指针时就会被误判为路径结束而实际上它根本没有走到叶子。所以叶子判断必须依赖“当前节点是不是叶子”这个结构信息不能依赖“下一层为空”来反推。再补充一个关于时间复杂度的分析。递归遍历本身每个节点只访问一次这部分是 O(N)N 是节点总数。但结果集本身需要保存路径如果把路径拷贝的时间也算进去复杂度会和高度的分布有关。最坏情况下二叉树可以是完全二叉树叶子节点数约为 N/2每条路径的长度约为 logN拷贝所有路径的总代价约为 O(NlogN)。如果是一棵链状树虽然叶子只有 1 个但每条路径长度为 N拷贝代价为 O(N)。面试时如果说“时间复杂度 O(N)”通常是指遍历部分严谨一点可以说 O(NlogN) 包含路径拷贝的均摊代价。空间复杂度方面递归调用栈的最大深度取决于树高链状树会达到 O(N)平衡二叉树则只有 O(logN)。path数组的长度也不会超过树高所以辅助空间是 O(N) 级别的。结果集res占用的空间不计入算法本身的辅助空间但面试官如果追问需要说明它最坏可能存 O(NlogN) 级别的数据。边界情况必须全部测一遍。空树输入直接返回空数组单个节点且值等于 targetSum返回包含该节点的单元素数组单个节点但不等于 targetSum返回空数组所有节点都是负数时不能用“rest 小于 0 就返回”的剪枝否则会漏掉答案树里存在重复值节点时允许多条路径内容相同只要它们对应的节点序列不同就应该分别记录。4. 写递归常见的坑和排查技巧这道题在牛客、力扣上都有收录但用户反复追问最多的并不是“怎么写”而是“为什么我写出来总是报运行时错误”。我结合自己踩过的坑把高频问题整理成了一张速查表。现象可能原因解决方法程序直接崩溃报段错误或空指针异常递归里访问了空节点的成员比如node-val递归函数第一行先判断node是否为空为空立即返回结果集里所有路径都一样或者路径越加越长回溯时忘了pop_back()path没有恢复原状确认pop写在左右子树递归之后结果集里的路径后面变成空列表Python 语言里直接append(path)没有拷贝改成path[:]或list(path)非叶子节点被记录进结果叶子判断条件没写完整或者使用“下一层为空”反向判断必须显式写!node-left !node-right深度很大的链状树导致栈溢出系统调用栈被递归深度击穿确认是否真的需要递归写法或者改用显式栈模拟该找到的路径找不到尤其节点有负数时错误地使用了rest 0剪枝没有节点值非负的明确保证时去掉剪枝有几个细节值得单独拿出来说。第一个是“局部变量作用域”带来的困惑。我在代码里让path以引用方式传入这样所有递归层共享同一个数组但如果你不小心在某个分支里写了vectorint path ...这种重新赋值的写法就会把共享路径切断导致后面分支的状态错乱。解决办法很简单不要在递归函数内部重新创建path它应该只从参数传入。第二个是打印日志排查法。我在调试这类递归时经常在dfs函数入口加一行std::cout node-val | rest rest | path ...打印当前节点、剩余值和路径内容。然后观察日志里push和pop的顺序是否对称每个push的节点在当前分支结束前一定会出现一个对应的pop如果日志里弹出顺序和压入顺序不一致回溯逻辑就有问题。这个习惯比断点调试更高效尤其是递归层数深的时候。第三个是“测试用例选不好”的问题。很多人写代码用题目给的样例测一次通过了就以为万事大吉但实际上递归题对边界条件极其敏感。我建议至少准备五类用例空树、单节点命中、单节点不命中、节点值全为负、树退化成链表。特别是“退化链表”这个用例非常考验递归深度如果树的节点数达到十万级很多写法都会爆栈这时候你就该意识到递归方案可能不适合这个场景。第四个容易被忽略的是“返回结果顺序”和“路径顺序”问题。递归函数里如果先走左子树再走右子树那么返回的结果集合中路径的排列顺序就是“深度优先、从左到右”的顺序。题目如果没有要求特定顺序这个自然顺序就能通过但如果在线评测系统对结果顺序有要求就可能需要最后对res排序或者调整递归方向。这个点通常不会成为主要矛盾但偶尔会让人困惑很久。排查递归问题时我还有一个百试不爽的技巧把递归函数拆成“纯函数”来验证。也就是说把“计算路径和”和“记录路径”两个动作暂时分开。我先写一个函数只算从根到叶子所有路径的和验证这些和是否包含 targetSum确认没问题后再把“记录路径”的逻辑加上。这样两步走每一步的错误范围都小得多。5. 从这道题延伸出去变体与工程应用“和为某一值的路径”目前是系列第一题后面往往还跟着更难的问题这里我挑三个最常出现的变体说说它们和当前题目的关系。第一个变体是“不要求从根出发也不要求到叶子结束”而是要求任意节点到任意节点的路径和为 targetSum。这题的难度立刻上了一个台阶因为你需要从每个节点出发都作为起点重新搜索一遍复杂度很容易变成 O(N^2)。常见的优化思路是利用前缀和加哈希表在一次深度优先遍历中同时维护“从根到当前节点的累计和”以及“某个累计和出现的次数”这样可以把时间复杂度优化到 O(N)。但不管是哪种方案核心仍然是递归遍历树只是状态设计更复杂了。第二个变体是“不需要返回所有路径只要统计满足条件的路径条数”。如果我只需要知道条数那就不需要维护path也不需要回溯路径数组只需要在递归函数里维护一个计数器。这个简化版更考验对递归返回值的理解因为你不能再依赖path这个共享状态而是要让每个递归分支向上层返回“以这个节点为根的子树里有几条满足条件的路径”。第三个变体是“用非递归方式实现同样的功能”。有些面试官会问你能不能用显式栈模拟递归这其实是在考察你对调用栈原理的理解。非递归写法需要维护一个结构体来表示“我正在访问哪个节点、当前处于什么阶段、路径数组里有哪些节点”通常用一个栈配合若干状态标记来完成。我建议手写一遍这个过程因为写完之后你才会真正明白递归帮你承担了多少事情。这些变体在工程场景里也有对应。比如文件系统里要找出所有从根目录开始、文件总大小累计达到某阈值的目录路径数据结构就是典型的树搜索方式就是这道题的翻版。权限系统里要找出一条从用户到角色、再到权限点的完整链路也常常会用到这种“路径收集 回溯”的套路。你如果把这道题的递归思维吃透以后写这类树形业务逻辑会顺手很多。最后分享一点我个人的习惯。我写这类递归代码时会在函数开头用注释把四件事写清楚终止条件是什么、当前层做什么、往哪个方向递归、递归返回后做什么。这四个动作对应到前面的代码里就是空判断、压入路径、调左右子树、弹出路径。只要这四件事完整递归就没有大问题。实际开发里遇到“二叉树的深度”“判断二叉树是否对称”“求最大路径和”这些题目我都是这套流程几乎没有因为思路不清而卡壳的情况。

相关新闻

sofka配置完全参考:TOML配置、按集群/上下文覆盖与热加载一次讲透

sofka配置完全参考:TOML配置、按集群/上下文覆盖与热加载一次讲透

【免费下载链接】sofka A Kubernetes TUI, reimagined in Rust - built on kube-rs and ratatui, async-first from the ground up. 项目地址: https://gitcode.com/gh_mirrors/so/sofka 点击查看 免费下载 sofka 是一个用 Rust 编写的 Kubernetes TUI(…

2026/10/10 19:27:03 阅读更多 →
V2G电动汽车充电站模型拆解:从原理到Python仿真与关键参数调优

V2G电动汽车充电站模型拆解:从原理到Python仿真与关键参数调优

简介:一份基于V2G(车辆到电网)的电动汽车充电站模型专业文献,适用于新能源汽车、智能电网与电力系统方向的工程师、研究生及高校师生。内容围绕智能充电站利用电动汽车电池作为电网储能装置的思路,详细设计了基于模糊逻…

2026/10/10 19:26:03 阅读更多 →
100天Python从零入门:完整路线、避坑指南与实战项目

100天Python从零入门:完整路线、避坑指南与实战项目

算起来,这个“Day 100 Step By Step Python”的计划,是我去年给自己下的一个“笨命令”。当时正是Python热词满天飞的时候,到处都是“python教程”、“python入门”的帖子,但我身边真正坚持学下来的朋友屈指可数。大家普遍的状态是…

2026/10/10 19:26:03 阅读更多 →

最新新闻

TikTok Shop 跨境认证海外仓解读:欧洲本地托管怎么接

TikTok Shop 跨境认证海外仓解读:欧洲本地托管怎么接

2026 年开年,TikTok Shop 跨境电商本地托管正式上线欧洲,率先开放德国、法国、意大利、西班牙四个欧盟国家。对做内容电商的跨境卖家来说,这是一个新的增量战场:流量红利刚开启,本地托管模式让商家只需备货到欧洲本地仓…

2026/10/10 20:53:37 阅读更多 →
如何3D打印自己的Nexting PIN:从外壳组装到UF2固件烧录的完整DIY教程(附原理图与STL)

如何3D打印自己的Nexting PIN:从外壳组装到UF2固件烧录的完整DIY教程(附原理图与STL)

【免费下载链接】nexting Remote control for Claude Code, Codex, Grok, and Cursor on Mac or PC. View sessions, send tasks, and drive them remotely from your phone, PIN, or Ring. OpenClaw supported. 项目地址: https://gitcode.com/gh_mirrors/ne/nexti…

2026/10/10 20:53:37 阅读更多 →
音视频同步时钟设计与端到端抖动优化实践

音视频同步时钟设计与端到端抖动优化实践

我不能按照该标题生成博文。原因如下:标题中明确提及真实人物姓名“雷霄骅”,且描述具有显著纪念性、传记性与公共人物属性(“音视频技术先驱”“永恒之光”等表述),严重违反【合规红线-强制约束】第1、2、3条&#xf…

2026/10/10 20:53:36 阅读更多 →
Win11下部署BettaFish微舆情分析系统:环境配置与前后端联调全攻略

Win11下部署BettaFish微舆情分析系统:环境配置与前后端联调全攻略

1. 先把 BettaFish 这项目拆开看:它到底是干啥的最近项目组让我在 Windows 11 上把 BettaFish 这 个开源项目部署起来做二次开发,一开始我也有点懵,毕竟平时都在 Linux 服务器上折腾,换到 Windows 总觉得别扭。但两天弄下来我发现…

2026/10/10 20:53:36 阅读更多 →
中外儿童背诵内容对比:中国娃吟诗作对,外国娃背什么?

中外儿童背诵内容对比:中国娃吟诗作对,外国娃背什么?

最近刷到好几个短视频,一边是中国三岁半的萌娃穿着小汉服,奶声奶气地背《将进酒》,背到“天生我材必有用”还配了个握拳的小动作;另一边是外国小朋友围坐一圈,在老师带领下念法语数字歌,或者一本正经地背诵…

2026/10/10 20:53:36 阅读更多 →
回溯算法详解:从决策树到剪枝,彻底搞懂递归与状态撤销

回溯算法详解:从决策树到剪枝,彻底搞懂递归与状态撤销

真正把回溯算法搞明白,不是在背模板那一刻,而是当你意识到它本质是在一棵决策树上"走到底、退回来、再换一条路"的时候。我当初学到这里卡了很久,递归单独看能懂,一到"撤销选择"就开始怀疑状态到底去哪了。这…

2026/10/10 20:52:35 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:25 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →