/**************************************************************************
*
* 107. [Binary Tree Level Order Traversal II](https://leetcode.com/problems/binary-tree-level-order-traversal-ii/)
*
* Given the root of a binary tree, return the bottom-up level order traversal of its nodes' values.
* (i.e., from left to right, level by level from leaf to root).
*
* Example:
* 3
* / \
* 9 20
* / \
* 15 7
* Input: root = [3,9,20,null,null,15,7]
* Output: return its bottom-up level order traversal as,
* [
* [15,7],
* [9,20],
* [3]
* ]
*
**************************************************************************/
class Solution {
public:
vector<vector<int>> levelOrderBottom(TreeNode* root) {
vector<vector<int> >result;
if (!root)return result;
queue<TreeNode*>current, next;
current.push(root);
while (!current.empty()) {
vector<int>level;
while (!current.empty()) {
TreeNode*p = current.front();
level.push_back(p->val);
current.pop();
if (p->left)next.push(p->left);
if (p->right)next.push(p->right);
}
result.push_back(level);
swap(current, next);
}
reverse(result.begin(), result.end());
return result;
}
};
class Solution {
public:
vector<vector<int>> levelOrderBottom(TreeNode* root) {
vector<vector<int> >result;
traverse(root, 1, result);
reverse(result.begin(), result.end());
return result;
}
void traverse(TreeNode*root, size_t level, vector<vector<int> >&result) {
if (!root)return;
if (level>result.size())
result.push_back(vector<int>());
result[level - 1].push_back(root->val);
traverse(root->left, level + 1, result);
traverse(root->right, level + 1, result);
}
};