解题思路
运用C++ queue容器按层优先级储存节点并进行操作。具体步骤如下:
1.创建一个答案数组 ans,用来存储层序遍历的结果;创建了一个队列 q,用来辅助进行层序遍历。
vector<vector<int> > ans;
queue<TreeNode*> q;
2.处理特殊情况:如果根节点为空,直接返回空的层序遍历结果。如果不为空,将根节点放入队列中。
if(root == nullptr)
return ans;
q.push(root);
3.当队列不为空时,创建一个空数组 vec,用来存储当前层的节点值;获取当前队列的大小 n,表示当前层的节点数目。注意这里一定要单独定义,不然后面循环条件会如图示出错:
进入内层循环,遍历当前层的所有节点:
int n = q.size();
for(int i = 0; i < n; i++)
{
TreeNode* temp = q.front(); // 取出队列的头节点
vec.push_back(temp->val); // 将节点值加入当前层的存储向量中
q.pop(); // 将节点移出队列
// 将当前节点的子节点(如果存在)加入队列
if(temp->left != nullptr)
q.push(temp->left);
if(temp->right != nullptr)
q.push(temp->right);
}
ans.push_back(vec); // 将当前层的节点值存入结果向量中
输出答案。
完整代码
class Solution{
public:
vector<vector<int>> levelOrder(TreeNode* root)
{
vector<vector<int> > ans;
queue<TreeNode*> q;
if(root == nullptr)
return ans;
q.push(root);
while(!q.empty())
{
vector<int> vec;
int n = q.size();
for(int i = 0; i < n; i++)
{
TreeNode* temp = q.front();
vec.push_back(temp->val);
q.pop();
if(temp->left != nullptr)
q.push(temp->left);
if(temp->right != nullptr)
q.push(temp->right);
}
ans.push_back(vec);
}
return ans;
}
};