题目背景
我们需要解决的是 LeetCode 107 题:二叉树的层序遍历 II。不同于常规的从上到下输出,本题要求从叶子节点所在层开始向上返回每一层的节点值。
接口定义如下:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
vector<vector<int>> levelOrderBottom(TreeNode* root) {
}
};
核心思路
二叉树的层序遍历本质上就是广度优先搜索(BFS)。要按层访问,最直观的数据结构就是队列(Queue),利用其'先进先出'的特性来管理节点的访问顺序。
在实际编码中,为了区分不同层级,通常需要一个变量记录当前层的节点数量。每处理完一层,再更新下一层的节点数。这样就能确保每次循环只处理同一深度的节点。
逻辑流程
- 初始化:创建一个二维数组用于存储结果,如果根节点为空直接返回空数组。
- 入队:将根节点加入队列,并记录当前层节点数为 1。
- 逐层遍历:利用
level_k_size控制内层循环次数。每次取出队头节点,将其值存入临时一维数组,同时将其非空的孩子节点依次入队。- 注意:这里不能直接 pop 后释放内存,因为还需要访问孩子的指针。建议先用一个指针暂存队头节点,pop 后再操作。
- 层级切换:当一层节点处理完毕,将临时数组加入结果集,并更新
level_k_size为当前队列的大小(即下一层的节点总数)。 - 逆置结果:由于题目要求自底向上,最后对结果二维数组执行逆置操作即可。
代码实现
下面是完整的 C++ 实现,包含必要的成员变量和逻辑细节。
class Solution {
public:
vector<vector<int>> levelOrderBottom(TreeNode* root) {
vector<vector<int>> vv; // 存储最终结果
queue<TreeNode*> _q; // 辅助队列
if (root != nullptr) {
_q.push(root);
}
while (!_q.empty()) {
vector<int> v;
level_k_size = _q.();
(level_k_size--) {
TreeNode* node = _q.();
_q.();
v.(node->val);
(node->left) _q.(node->left);
(node->right) _q.(node->right);
}
vv.(v);
}
(vv.(), vv.());
vv;
}
};


