题目
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
示例:
二叉树:[3,9,20,null,null,15,7]
,
3
/ \
9 20
/ \
15 7
返回其层序遍历结果:
[
[3],
[9,20],
[15,7]
]
知识点
C++中的队列queue
基本用法:(这部分转载自https://blog.csdn.net/lady_killer9/article/details/79261798)
queue 和 stack 有一些成员函数相似,但在一些情况下,工作方式有些不同:
- front():返回 queue 中第一个元素的引用。如果 queue 是常量,就返回一个常引用;如果 queue 为空,返回值是未定义的。
- back():返回 queue 中最后一个元素的引用。如果 queue 是常量,就返回一个常引用;如果 queue 为空,返回值是未定义的。
- push(const T& obj):在 queue 的尾部添加一个元素的副本。这是通过调用底层容器的成员函数 push_back() 来完成的。
- push(T&& obj):以移动的方式在 queue 的尾部添加元素。这是通过调用底层容器的具有右值引用参数的成员函数 push_back() 来完成的。
- pop():删除 queue 中的第一个元素。
- size():返回 queue 中元素的个数。
- empty():如果 queue 中没有元素的话,返回 true。
- emplace():用传给 emplace() 的参数调用 T 的构造函数,在 queue 的尾部生成对象。
- swap(queue<T> &other_q):将当前 queue 中的元素和参数 queue 中的元素交换。它们需要包含相同类型的元素。也可以调用全局函数模板 swap() 来完成同样的操作。
代码
bfs,AC
class Solution
{
public:
vector<vector<int>> levelOrder(TreeNode *root)
{
vector<vector<int>> ans;
vector<int> curr;
if (root == nullptr)
{
return ans;
}
queue<TreeNode *> q;
q.push(root);
int cnt = 1;
while (!q.empty())
{
int cnt_new = 0;
for (int i = 0; i < cnt; i++)
{
TreeNode *temp = q.front();
curr.push_back(temp->val);
q.pop();
if (temp->left != nullptr)
{
q.push(temp->left);
cnt_new++;
}
if (temp->right != nullptr)
{
q.push(temp->right);
cnt_new++;
}
}
ans.push_back(curr);
curr.clear();
cnt = cnt_new;
}
return ans;
}
};