题目链接: leetcode.
简单题,我第一反应竟然是用两个队列
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
/*
执行用时:8 ms, 在所有 C++ 提交中击败了41.19%的用户
内存消耗:12.2 MB, 在所有 C++ 提交中击败了83.09%的用户
*/
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
if(root == nullptr)
return {};
queue<TreeNode*> Q1, Q2;
Q1.push(root);
vector<vector<int>> ans;
while(!Q1.empty() || !Q2.empty())
{
vector<int> tmp;
while(!Q1.empty())
{
TreeNode* node = Q1.front();
Q1.pop();
tmp.push_back(node -> val);
if(node -> left)
Q2.push(node -> left);
if(node -> right)
Q2.push(node -> right);
}
if(!tmp.empty())
{
ans.push_back(tmp);
tmp.clear();
}
while(!Q2.empty())
{
TreeNode* node = Q2.front();
Q2.pop();
// cout<<node->val<<endl;
tmp.push_back(node -> val);
if(node -> left)
Q1.push(node -> left);
if(node -> right)
Q1.push(node -> right);
}
if(!tmp.empty())
ans.push_back(tmp);
}
return ans;
}
};
官解选择的方法是记录每一层的个数
当队列不为空的时候,求当前队列的长度 s_i
依次从队列中取 s_i个元素进行拓展,然后进入下一次迭代
/*
执行用时:4 ms, 在所有 C++ 提交中击败了83.45%的用户
内存消耗:12.1 MB, 在所有 C++ 提交中击败了95.55%的用户
*/
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
if(root == nullptr)
return {};
queue<TreeNode*> Q;
Q.push(root);
vector<vector<int>> ans;
while(!Q.empty())
{
vector<int> tmp;
int n = Q.size();
for(int i = 0;i < n;++i)
{
TreeNode* node = Q.front();
Q.pop();
tmp.push_back(node -> val);
if(node -> left)
Q.push(node -> left);
if(node -> right)
Q.push(node -> right);
}
ans.push_back(tmp);
}
return ans;
}
};
这篇博客讨论了LeetCode上的一道简单题目,关于二叉树的层次遍历。作者提供了两种不同的C++实现方式,一种使用两个队列交替处理,另一种则是在每次迭代时记录当前层节点的数量。两种方法都在时间和空间效率上有较好的表现。
1189

被折叠的 条评论
为什么被折叠?



