“Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。”
一、题目描述
给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。
示例 1:
输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]
示例 2:
输入:root = [1]
输出:[[1]]
示例 3:
输入:root = []
输出:[]
提示:
- 树中节点数目在范围
[0, 2000]内 -1000 <= Node.val <= 1000
二、思路分析
二叉树的层序遍历,说白了就是按照从上到下、从左到右的顺序 一层一层地输出节点值。
思路如下:
- 定义
res数组,用来存放每一层的节点值;定义que队列,用来存放根节点或父节点。 - 一开始先将
root存进que中。进入条件为!que.empty()的while循环,在这个循环里,我们要做的便是将que队列中的所有节点拿出来放进一个数组中,再将这个数组push进res中。 - 要获取
que队列的所有节点,我们还需进行一次遍历,每获取一个节点,就将其取出并存进数组中,同时要将取出的节点的子节点都push进que队列中,这样就确保了que中的节点都是同一层的。
注意:在遍历
que时,que.size()要事先存起来,不能在for循环里表示,如果写成for(int i=0; i<que.size(); i++)的话,每次执行循环时que都可能有子节点push进来,导致 que.size()发生改变,但如果事先int size=que.size()的话,无论que长度怎样改变,都不会受其影响。
三、AC 代码
/**
* 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>> levelOrder(TreeNode* root) {
vector <vector <int>> res;
if (!root) return res;
queue <TreeNode*> que;
que.push(root);
while (!que.empty()) {
vector<int> arr;
int size = que.size();
for (int i = 0; i < size; i++) {
TreeNode* cur = que.front();
que.pop();
arr.push_back(cur -> val);
if (cur -> left) {
que.push(cur -> left);
}
if (cur -> right) {
que.push(cur -> right);
}
}
res.push_back(arr);
}
return res;
}
};