题目背景
本题要求实现二叉树的自底向上层序遍历,即从叶子节点所在层开始向上遍历至根节点。接口函数需返回二维数组 vector<vector<int>>。
核心定义
二叉树的层序遍历,又称广度优先搜索(BFS),是指从根节点开始,按'从上到下、从左到右'的顺序逐层访问树中所有节点。先遍历完第 1 层(根节点),再遍历第 2 层,以此类推,直到最后一层的所有节点都被访问。
实现思路
二叉树层序遍历的本质是'先进先出'的访问逻辑,队列是实现该逻辑的关键数据结构。
大致思路:
- 将二叉树的节点地址存入队列。
- 使用变量记录每一层的节点个数(如
level_k_size)。 - 利用循环控制节点出队列的个数,保证每一层的节点都能被完整处理。
- 在节点出队列的同时,将其值插入临时数组,并将不为空的孩子节点加入队列。
- 每循环一次得到一层的数据,直到遍历完整个二叉树。
- 由于题目要求自底向上返回,最后对存储结果的二维数组进行逆置处理。
关键步骤:
- 初始化: 创建二维数组存储结果。判断根节点是否为空,若为空直接返回;否则将根节点入队,并设置初始层级大小为 1。
- 层级遍历: 根据当前层级大小作为循环次数遍历节点。获取队头节点,记录其值,弹出队头。若左右孩子不为空,则依次入队。
- 更新状态: 每层遍历结束后,将当前层数据存入结果数组,并更新下一层的节点数量(即当前队列的大小)。
- 结果处理: 当队列为空时遍历结束,对结果数组执行逆置操作后返回。
注意:
- 出队前需保存节点指针,防止节点释放后无法访问子节点。
- 每次出队都要确保将非空子节点入队,以便准确更新层级大小。
代码实现
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
// 二叉树节点定义
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode() : val(0), left(nullptr), right(nullptr) {}
TreeNode(int x) : val(x), (), () {}
( x, TreeNode *left, TreeNode *right) : (x), (left), (right) {}
};
{
:
vector<vector<>> (TreeNode* root) {
vector<vector<>> vv;
(root == ) vv;
queue<TreeNode*> q;
q.(root);
level_k_size = ;
(!q.()) {
vector<> v;
(level_k_size--) {
TreeNode* node = q.();
q.();
v.(node->val);
(node->left) q.(node->left);
(node->right) q.(node->right);
}
vv.(v);
level_k_size = q.();
}
(vv.(), vv.());
vv;
}
};


