题目描述
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
示例:
二叉树:[3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其层序遍历结果:
[
[3],
[9,20],
[15,7]
]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-level-order-traversal
解题思路
没啥好说的,创建一个二维数组直接BFS一层一层扫就行了。
1.要注意的点就是如何以层为间隔来往二维数组中存数据,这里在队列里面的循环中设置了变量sz来记录当前队列的长度,以及一个一维数组tp来存当前这层的所有结点的数据。
2.在内层循环的外面再把一维数组push到二维数组中就行了,这题纯按照套路来解。
代码
/**
* 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:
void dfs(TreeNode* root, vector<vector<int>> &res){
queue<TreeNode*> q; //队列用来存每层扫描的结点数据
q.push(root); //根结点入队
while(!q.empty()){ //队列非空时
int sz=q.size(); //sz来记录当前队列的长度
vector<int> tp; //一维数组tp暂存当前层的所有结点数据
while(sz>0){ //sz>0时,用这种方法可以按层存
TreeNode* p=q.front(); //p记录当前对头元素
q.pop(); //出队
if(p->left!=NULL){ //当p->left非空
q.push(p->left); //入队
}
if(p->right!=NULL){ //当p->right非空
q.push(p->right); //入队
}
tp.push_back(p->val); //把当前记录的结点p的值加入一维数组tp
sz--;
}
res.push_back(tp); //当前一层结束,把结果加入到二维数组中
}
}
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> res; //二维数组用来返回结果
if(root==NULL){ //空树,直接返回空二维数组
return res;
}
dfs(root,res); //非空则dfs扫一遍,并且把扫到的结点的值按层存入res
return res; //返回结果
}
};