解题思路
使用queue进行层序遍历,queue保存着当前层的所有结点
count表示当前层的所有结点的个数。不能用q.size()来替换,因为在while循环中需要将当前层的节点的孩子结点同时进队列,这样导致每层的数量不正确。
顺序:
- 将根节点入队,count为1-表示当前层只有一个节点
- 循环处理该队列,直到队列为空
- 取队列头,将该节点的孩子节点入队
- 每层的节点信息保存在row_nodes中,count减一
- 至此,当前节点已经没用了,抛出pop
- 判断count是否为0
- 如果不为0 则不需要进行将该层push到结果数组中
- 如果为0,则表示该层结束,将该层节点push到结果数组中,同时清空row_nodes 开始下一层节点push 同时count现在为下一层节点数 即当前队列的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) {
if (root==nullptr) {
return {};
}
vector<vector<int>> result;
queue<TreeNode*> q;
q.push(root);
int count = 1; // 表示当前level的节点个数
vector<int> row_nodes;
while (!q.empty()) {
TreeNode* cur = q.front();
if (cur->left) {
q.push(cur->left);
}
if (cur->right) {
q.push(cur->right);
}
row_nodes.push_back(cur->val);
q.pop();
--count;
if (count==0) {
result.push_back(row_nodes);
row_nodes.clear();
count = q.size();
}
}
return result;
}
};