统计二叉树叶子节点路径数量需递归遍历,仅当节点左右子指针均为nullptr时计数加一;层级标签通过递归传入当前深度参数实现,避免静态变量或空节点误增深度;dfs比bfs更适配路径记录,回溯时需pop_back确保路径准确。

怎么统计二叉树所有叶子节点的路径数量
直接递归遍历到底,遇到叶子就计数加一。关键不是“数多少个叶子”,而是确认什么是叶子:左右子指针都为 nullptr 的节点。别把只有一个孩子的节点误判成叶子。
常见错误是空节点提前 return 却没处理边界,或者在非叶子节点也 ++ 计数。正确做法只在满足 !root->left && !root->right 时累加。
- 用一个整型引用或返回值传递计数,避免全局变量干扰多棵树场景
- 如果还要记录每条路径(比如存 vector
>),注意回溯时 pop_back,否则路径会残留上一层数据 - DFS 比 BFS 更自然,因为路径是深度方向延伸的;BFS 虽然也能做,但得额外存每个节点的路径数组,空间开销明显更大
如何给每个叶子节点打上“所在层级”的标签
层级就是从根到该叶子经过的边数(或节点数减一)。递归时把当前深度作为参数传下去,初始调用传 0 或 1 —— 这取决于你定义“根节点高度是 0 还是 1”。统一就行,但必须明确。
容易踩的坑是深度变量没传参、用了静态局部变量,或者在进入空节点时仍执行 depth++。正确逻辑是:只有非空节点才推进 depth,且仅在叶子处记录。
- 推荐函数签名类似:
void dfs(TreeNode* root, int depth, vector<pair int>>& leaves)</pair>,其中 pair 第一个元素存值,第二个存 depth - 如果后续要按层级分组(比如“第3层有4个叶子”),直接用 map
统计 depth 出现次数更高效 - C++17 可用
std::optional<int></int>表示可能不存在的深度,但简单统计场景没必要,徒增复杂度
为什么不能直接用 height() 函数代替逐叶标记
height() 返回整棵树的最大深度,它不告诉你每个叶子在哪层。一棵树可能有多个叶子分布在不同高度,比如左子树深、右子树浅,这时单个 height 值毫无意义。
有人试图先算整棵树高,再反向查哪些节点深度等于 height —— 这既低效(重复遍历),又错判(最大深度节点不一定是叶子,可能是内部节点)。
- 真正需要的是每个叶子的 depth,不是整棵树的 height
- 若只要“最深叶子的层数”,那确实只需一次 DFS 求 max depth;但题目要求“分级高度计算”,意味着要区分不同层的叶子,必须逐个记录
- 别混淆
depth(从根向下)和height(从叶向上):leaf 的 depth = height_from_root,而 leaf 的 height = 0
实际写的时候怎么组织数据结构
如果只是统计数量和各层叶子数,两个 int 变量 + 一个 unordered_map
struct LeafInfo {
int val;
int depth;
vector<int> path; // 可选
};
vector<leafinfo> allLeaves;
</leafinfo></int>
注意 vector 在递归中频繁拷贝 path 会拖慢性能。高频调用场景下,改用引用传入临时 path vector,并在进入/退出节点时 push/pop,比每次构造新 vector 快得多。
另外,C++ 中 TreeNode 通常来自 LeetCode 风格定义:struct TreeNode { int val; TreeNode *left; TreeNode *right; };,确保你的 nullptr 判定和指针解引用安全——访问 left/right 前必须先判空。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











