答案是用深度优先递归,每层执行 curr = curr * 10 + root->val(负数需先取绝对值再拼接),仅叶子节点将 curr 累加;BFS 因需额外存储每路径 curr 值而更复杂易错。

如何用递归遍历并累加所有根到叶子路径的数值
直接结论:用深度优先递归,每下一层就把当前节点值乘10再加子节点值(模拟数字拼接),到底层叶子时把该路径数加入总和。关键不是“求和路径个数”,而是把每条路径视作一个整数(比如 1→2→3 拼成 123),再把所有这样的整数加起来。
常见错误是把路径上节点值简单相加(如 1+2+3=6),但题目隐含路径表示十进制数——这是多数人一开始没意识到的坑。
-
root为空时直接返回 0,不参与任何路径 - 递归函数需携带当前路径代表的数值
curr,初始调用传0 - 更新逻辑必须是
curr = curr * 10 + root->val,不是curr + root->val - 仅当
root->left == nullptr && root->right == nullptr时才把curr累加进结果
为什么不能用 BFS 或迭代栈简单替代 DFS
BFS 虽能遍历所有路径,但难以自然维护“从根到当前节点构成的整数”——因为同一层不同节点的父路径完全不同,必须为每个队列元素单独存一份 curr 值,空间开销翻倍且易出错;而 DFS 天然靠函数调用栈保存路径状态。
实际测试发现:用 std::queue<:pair int>></:pair> 实现 BFS 版本,代码行数多出 40%,且容易在入队时错用 curr 值(比如忘了乘10)。
立即学习“C++免费学习笔记(深入)”;
- DFS 递归版本时间 O(n),空间 O(h),h 是树高,最坏 O(n)
- BFS 迭代版本时间也是 O(n),但额外空间 O(w),w 是最大宽度,满二叉树下可能达 O(n/2)
- 所有非递归写法都需手动模拟“路径数字继承”,比递归更难验证正确性
处理负数节点值时要注意什么
题目没说节点非负,所以 root->val 可能为负。但路径拼接仍按十进制规则:-1→2 应为 -12,不是 (-1)*10+2 = -8 —— 这里要统一理解:路径数值 = 符号位 + 后续绝对值拼接。
稳妥做法是递归前先记录符号,或全程用 long long 防溢出,避免在乘10加值时因负号导致逻辑错乱。
- 不要写
curr * 10 + root->val然后期望它自动处理负号拼接 - 推荐统一转正处理:
int abs_val = abs(root->val); curr = curr * 10 + abs_val; int final_num = (root->val ,但仅在首次非根节点生效 - 更简洁做法:把符号提取到根节点,后续只拼绝对值,最后乘回符号(前提是整棵树符号一致,否则无通用解)
LeetCode 129 题的边界 case 验证点
这题编号是 leetcode 129,提交前务必测这三组输入:
- 单节点:
[1]→ 期望输出1 - 带零的路径:
[1,0,1](根1,左0,右1)→ 路径 1→0=10,1→1=11,总和 21 - 深树但值小:
[0,0,0]→ 0→0=0,0→0=0,总和 0(注意不是 0+0=0 的错觉,而是两条路径各贡献 0)
最容易漏的是空子树分支判断——比如某节点只有左子,右子为 nullptr,不能误把它当叶子。


















