LeetCode102. 二叉树的层序遍历
文章目录
- 题目要求:
- 思路
- C++代码
题目要求:
给你二叉树的根节点 root
,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。
思路
首先想到的就是
- 根节点入队
- 取队头元素(出队),把队头节点的左右孩子入队。
- 重复
但如何要把每一层分别区分出来?★ 关键
一个一个的出显然无法判断是第几层,所以考虑一层一层地出。
用一个变量levelSize
记录该层的节点个数,levelSize = queue.size()
当levelSize
为0的时候:
1. 本层节点已经出完
2. 下一层节点已经入完
解题思路:
利用一个队列q,然后一个vector,
vector里的每个元素都是一个vector<int>
用于存放每一层的数据
- 根节点入队列
- 循环开始:获取队列长度作为本层的长度
- 取出队头元素
- 队头元素的数据push_back进 vector
- 把队头元素的左孩子和右孩子入队(如果不为空)
- 重复循环
当队列为空的时候,遍历结束
C++代码
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
queue<TreeNode*> q;
vector<vector<int>> vv;
//root不为空,入队
if(root)
{
q.push(root);
}
while(!q.empty()){
//本层节点个数
int levelSize = q.size();
//本层数据
vector<int> v;
while(levelSize--){
//取队头,出队
TreeNode* front = q.front();
q.pop();
int val = front->val;
v.push_back(val);
//左右孩子入队
if(front->left)
q.push(front->left);
if(front->right)
q.push(front->right);
}
//本层走完了,更新vv
vv.push_back(v);
}
return vv;
}
};