

相对于102.二叉树的层序遍历,就是最后把result数组反转一下就可以了。
cpp
// 原始层序遍历结果(从上到下):
// 第0层: [3]
// 第1层: [9, 20]
// 第2层: [15, 7]
// 反转后(从下到上):
// 第2层: [15, 7]
// 第1层: [9, 20]
// 第0层: [3]
cpp
class Solution {
public:
// 层序遍历二叉树,但结果从底向上返回(即最后一行在最前面)
vector<vector<int>> levelOrderBottom(TreeNode* root) {
// 创建队列用于BFS(广度优先搜索)
queue<TreeNode*> que;
// 如果根节点不为空,将其加入队列
if (root != NULL) que.push(root);
// 结果二维数组,将存储每层的节点值
vector<vector<int>> result;
// 当队列不为空时,继续处理每一层
while (!que.empty()) {
// 记录当前层的节点数量(固定大小,因为循环中队列大小会变化)
int size = que.size();
// 存储当前层所有节点值的临时数组
vector<int> vec;
// 遍历当前层的每个节点
for (int i = 0; i < size; i++) {
// 从队首取出节点
TreeNode* node = que.front();
que.pop(); // 弹出已处理的节点
// 将当前节点的值加入当前层的结果数组
vec.push_back(node->val);
// 如果左子节点存在,加入队列(下一层)
if (node->left) que.push(node->left);
// 如果右子节点存在,加入队列(下一层)
if (node->right) que.push(node->right);
}
// 将当前层的节点值数组加入最终结果
// 注意:这里按正常层序遍历顺序添加(从上到下)
result.push_back(vec);
}
// 将结果数组反转,使得底层的结果在最前面
// 正常层序遍历结果是 [[3],[9,20],[15,7]](从上到下)
// 反转后变为 [[15,7],[9,20],[3]](从下到上)
reverse(result.begin(), result.end());
// 返回反转后的结果
return result;
}
};