102. 二叉树的层序遍历
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> Result;
if (!root)
return Result;
queue<TreeNode *> Q;
int NodesInCurrLevel = 1;
int NodesInNextLevel = 0;
vector<int> *Level = new vector<int>();
Q.push(root);
while (!Q.empty()) {
// Pop front element
--NodesInCurrLevel;
TreeNode *TN = Q.front();
Q.pop();
if (TN->left) {
Q.push(TN->left);
++NodesInNextLevel;
}
if (TN->right) {
Q.push(TN->right);
++NodesInNextLevel;
}
Level->push_back(TN->val);
if (NodesInCurrLevel == 0) {
Result.push_back(*Level);
NodesInCurrLevel = NodesInNextLevel;
NodesInNextLevel = 0;
Level = new vector<int>();
}
}
return Result;
}
};
我的代码其实有点好玩,我相当于是手动把这个循环给展开了。但事实上我的写法并不好,因为牵涉到指针,效率低,并且也没有利用到层序遍历的特殊性质,这个特别特别有意思:
queue<TreeNode *> q;
q.push(root);
while (!q.empty()) {
int currentLevelSize = q.size();
ret.push_back({});
for (int i = 0; i < currentLevelSize; ++i) {
TreeNode *node = q.front();
q.pop();
ret.back().push_back(node->val);
if (node->left)
q.push(node->left);
if (node->right)
q.push(node->right);
}
}
这两层嵌套的循环事实上复杂度仍然是 \(\mathrm O(n)\) 的,并且它保证了每次外层循环都对应整一层。
二刷
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
std::queue<TreeNode *> Q;
std::vector<vector<int>> Result;
if (!root)
return {};
Q.push(root);
while (!Q.empty()) {
int LayerSize = Q.size();
Result.push_back({});
for (int i = 0; i < LayerSize; ++i) {
TreeNode *This = Q.front();
Result.back().push_back(This->val);
Q.pop();
if (This->left)
Q.push(This->left);
if (This->right)
Q.push(This->right);
}
}
return Result;
}
};
没什么好说的。
三刷
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
if (!root)
return {};
vector<vector<int>> Result;
queue<TreeNode *> Q;
Q.push(root);
while (!Q.empty()) {
int LayerSize = Q.size();
Result.emplace_back();
for (int i = 0; i < LayerSize; ++i) {
TreeNode *Cur = Q.front();
Q.pop();
Result.back().emplace_back(Cur->val);
if (Cur->left)
Q.push(Cur->left);
if (Cur->right)
Q.push(Cur->right);
}
}
return Result;
}
};
其实我一开始还想偷懒省掉if (Cur->left)这种判定,但是后来发现会导致空层,还是算了吧,这应该是最省心的写法了。