[LeetCode 107] Binary Tree Level Order Traversal II
Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left to right, level by level from leaf to root).
For example:
Given binary tree [3,9,20,null,null,15,7]
,
3
/ \
9 20
/ \
15 7
return its bottom-up level order traversal as:
[
[15,7],
[9,20],
[3]
]
DiffcultyEasy
Similar Problems
[LeetCode 102] Binary Tree Level Order Traversal Medium
Analysis
这道题只需要把之前那题的结果 reverse 一下就可以了。或者每次不是 push_back(),而是 insert()。
Solutions
- 非递归方法,使用 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;
}
}
std::reverse(res.begin(), res.end());
return res;
}
};
- 递归方法
class Solution {
public:
vector<vector<int>> levelOrderBottom(TreeNode* root) {
vector<vector<int> result;
levelRecursion(root, result, 0);
return result;
}
private:
void levelRecursion(TreeNode *node, vector<vector<int>& res, int level) {
if (node == nullptr) return;
if (res.size() < level + 1) { // 根节点不为空,说明至少有一层
res.insert(res.begin(), vector<int>());
}
res[res.size() - 1 - level].push_back(node->val);
levelRecursion(node->left, res, level + 1);
levelRecursion(node->right, res, level + 1);
}
};