[LeetCode 102] Binary Tree Level Order Traversal
Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level).
For example:
Given binary tree [3,9,20,null,null,15,7]
,
3
/ \
9 20
/ \
15 7
return its level order traversal as:
[
[3],
[9,20],
[15,7]
]
Diffculty
Easy
Similar Problems
[LeetCode 103] Binary Tree Zigzag Level Order Traversal Medium
[LeetCode 107] Binary Tree Level Order Traversal II Easy
[LeetCode 111] Minimum Depth of Binary Tree Easy
[LeetCode 314] Binary Tree Vertical Order Traversal Medium
Analysis
层次递归是属于广度优先遍历,广度优先通常采用队列来解决。 主要有两种解决思路,一是用两个 queue 来分别保存前一层和当前层的节点,第二种是一个 queue 来保存节点,但是用两个变量来分别保存两层节点的数量。
Solutions
- 两个 queue
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode *root) {
vector<vector<int>> res;
if (root == nullptr) return res;
queue<TreeNode*> currentLevel, nextLevel;
currentLevel.push(root);
vector<int> level;
while (!currentLevel.empty()) {
TreeNode *currNode = currentLevel.front();
currentLevel.pop();
if (currNode != nullptr) {
level.push_back(currNode->val);
nextLevel.push(currNode->left);
nextLevel.push(currNode->right);
}
if (currentLevel.empty()) {
if (level.size() != 0) {
res.push_back(level);
level.clear();
}
swap(currentLevel, nextLevel);
}
}
return res;
}
};
- 单个 queue
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode *root) {
vector<vector<int> res;
if (root == nullptr) return;
queue<Node*> nodesQueue;
int nodesInCurrentLevel = 0, nodesInNextLevel = 0;
nodesQueue.push(root);
++nodesInCurrentLevel;
vector<int> level;
while (!nodesQueue.empty()) {
Node *currNode = nodesQueue.front();
nodesQueue.pop();
nodesInCurrentLevel--;
if (currNode != nullptr) {
level.push_back(currNode->val);
nodesQueue.push(currNode->left);
nodesQueue.push(currNode->right);
nodesInNextLevel += 2;
}
if (nodesInCurrentLevel == 0) {
res.push_back(level);
level.clear();
nodesInCurrentLevel = nodesInNextLevel;
nodesInNextLevel = 0;
}
}
return res;
}
};