递归遍历二叉树收集根到叶子路径需用vector暂存路径,遇叶子节点拷贝存入结果,递归中通过引用+回溯维护路径;注意空节点判空、叶子判定、回溯时机及避免全局变量。

如何用递归遍历收集所有根到叶子路径
直接用深度优先递归是最自然的做法,关键不是“算总和”,而是先完整拿到每条路径——因为路径本身可能被复用(比如后续要输出、找最长路径等)。std::vector<int></int> 作为临时路径容器传入递归函数,遇到叶子节点就拷贝一份存进结果集。
- 递归参数必须包含当前路径
path(按值传递或引用+回溯),不能只传一个累加和,否则无法还原路径 - 判断叶子节点的条件是:
!node->left && !node->right,别漏掉空指针检查 - 回溯操作不可少:在递归返回前把刚 push 进去的节点值 pop 掉,否则上层调用会看到污染后的 path
路径总和汇总的两种常见需求场景
用户常混淆“每条路径的和”和“所有路径和的总和”。前者生成 vector<int></int>(每个元素是一条路径的和),后者是一个 int。实现时只需在叶子处做不同处理:
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 若需每条路径的和:在叶子节点执行
sums.push_back(accumulate(path.begin(), path.end(), 0)) - 若需所有路径和的总和:用引用参数
int& total累加,叶子处执行total += accumulate(path.begin(), path.end(), 0) - 注意
accumulate在<numeric></numeric>头文件里,C++17 前不能对空vector安全调用,确保 path 非空(根节点存在时 path 至少含一个元素)
避免栈溢出与空节点陷阱
二叉树深度过大时递归可能爆栈,但真正踩坑的往往是空输入和单节点情况。
- 入口函数第一行必须判空:
if (!root) return {};,否则递归会触发未定义行为 - 单节点树(只有 root)是合法叶子,必须被识别,不能误判为“无叶子”
- 非递归写法虽可规避栈限制,但需手动维护路径栈,代码复杂度上升且易错——除非明确知道树深 > 1000,否则不建议过早优化
为什么不用全局变量存路径或结果
用全局 vector 看似省事,但会导致多次调用间状态残留,尤其在单元测试或连续调用中出错。
- 每次调用必须从干净状态开始,所有中间容器都应在函数作用域内声明
- 返回值类型应明确:
vector<vector>></vector>(所有路径)、vector<int></int>(各路径和)、或int(总和),避免隐式转换和歧义 - 如果真想减少拷贝开销,可用移动语义:
return std::move(all_paths);,但前提是编译器支持 C++11 且确认调用方不需要原对象
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










