给你二叉树的根节点 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来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/binary-tree-level-order-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
逐层遍历,一层放一行。
如何区每一层的数据个数?
我们这里可以用一个level_size先保存第一层(也就是根节点)的个数,也就是1
然后按照层序遍历的方式出队level_size个数据,并将其左右结点放入队列中,也就是我们的第二层。
然后此时我们的第一层的数据就全部出队了,此时我们的队列中全部都是第二层的数据了,我们再更新我们的level_size,记录我们第二层的数据个数。
以此类推,直到我们的数据全部从队列中出来
相较于我们之前的层序遍历,我们就是新增了一个level_size,让其一层一层出来
/**
* 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) {
//队列里面存的是树的结点的指针
queue<TreeNode*> q;
size_t level_Size=0;
if(root)
{
q.push(root);
level_Size=1;
}
vector<vector<int>> vv;
while(!q.empty())
{
//控制一层一层出
vector<int> v;
for(size_t i=0;i<level_Size;++i)
{
//C++的queue在pop的时候并不会自动将其值返回,我们必须手动保存
TreeNode* front=q.front();
q.pop();
v.push_back(front->val);
//当前结点的左右子树只要不为空,就入队(层序遍历)
if(front->left)
{
q.push(front->left);
}
if(front->right)
{
q.push(front->right);
}
}
//当前层出完了,下一层都进队列了,当前队列的size就是下一层的数据个数
vv.push_back(v);
level_Size=q.size();
}
return vv;
}
};
或者我们这里采用双队列的思路
一个队列存结点的指针,一个结点存它的level,也就是层数。
我们将根节点入第一个队列的时候,我们往第二个队列中入队一个1,也就是第一层,
当我们的TreeNode*队列出队一个的时候,将其左子树和右子树入队,并且往level中标记其为2,也就是第二层,以此类推。