一.问题描述
从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。
例如:
给定二叉树: [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]
提示:
节点总数 <= 1000
来源:力扣(LeetCode)
链接:题目来源
二.问题分析
1)本题实质上是二叉树的层序遍历,然后要求将每一层的元素都放入同一个数组内。
2)对于层序遍历,最简单的方法就是广度优先搜素,使用队列最为数据结构。
3)要注意的一点是在每次的循环中我们需要把每一层元素都循环一遍。
4)二叉树的类型:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
三.代码
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> res; //目标数组
if(root==NULL) return res; //判空
queue<TreeNode*> q; //以结点的指针作为队列类型
q.push(root); //将第一层元素放入队列
while(!q.empty()) //开始广搜,判断条件为队列元素是否为空
{
int n = q.size(); //确定该层元素个数
vector<int> ans; //使用数组来存放该层所有元素
for(int i=0;i<n;i++) //该层的循环
{
TreeNode* temp=q.front(); //将该层第一个结点取出
q.pop(); //让第一个结点出队
ans.emplace_back(temp->val); //将该结点对应的值放入数组
if(temp->left!=NULL) {q.push(temp->left);} //找它的左孩子,若存在则入队
if(temp->right!=NULL) {q.push(temp->right);} //找它的右孩子,若存在则入队
}
res.emplace_back(ans); //将该层所有元素的值作为一个数组放入目标数组中
}
return res;
}
};