给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
- 示例:
二叉树:[3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]
- 思路
先将树的根节点入队,
如果队列不空,则进入循环
{
将队首元素出队,并输出它;
如果该队首元素有左孩子,则将其左孩子入队;
如果该队首元素有右孩子,则将其右孩子入队
}
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
std::vector<vector<int>> res;
std::vector<int> level;
std::queue<TreeNode*> nodeQueue;
if (root) {
nodeQueue.push(root);
}else {
return res;
}
while(!nodeQueue.empty()) {
std::queue<TreeNode*> tempNodeQueue;
while (!nodeQueue.empty()) {
auto node = nodeQueue.front();
if (node) {
level.push_back(node->val);
if (node->left) {
tempNodeQueue.push(node->left);
}
if (node->right) {
tempNodeQueue.push(node->right);
}
nodeQueue.pop();
}
}
nodeQueue.swap(tempNodeQueue);
//std::queue<TreeNode*>().swap(tempNodeQueue);//这里无用,当时提交的时候有两次超时,所以加上的。
res.push_back(level);
std::vector<int>().swap(level);//其实这里使用clear也可以,而且速度也较快。
}
return res;
}
};
参考官方题解精简如下:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
std::vector<vector<int>> res;
std::queue<TreeNode*> nodeQueue;
if (root) {
nodeQueue.push(root);
}else {
return res;
}
while(!nodeQueue.empty()) {
auto nodeQueueSize = nodeQueue.size();
res.push_back(std::vector<int>());
for (int i=0; i<nodeQueueSize; i++) {
auto node = nodeQueue.front();
if (node) {
res.back().push_back(node->val);
if (node->left) {
nodeQueue.push(node->left);
}
if (node->right) {
nodeQueue.push(node->right);
}
}
nodeQueue.pop();
}
}
return res;
}
};
来源:力扣(LeetCode)