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] ]
和第102题类似,给定一个二叉树,返回其层次遍历的结果,每层单独放到一起。不过本题返回的结果是最底层的子节点到最上面的根节点的结果,可以直接拿102题的结果,然后直接reverse就好。如果这样的话,那就太没意思了!对代码稍作改动,在开始时直接开辟好深度大小的vector,然后dfs每层遍历时,在结果中反向进行插入值就好,这样运行效率就提高了很多,代码记录如下:
class Solution {
public:
vector<vector<int>> levelOrderBottom(TreeNode* root) {
int depth = dfsDepth(root);
vector<vector<int>> ret(depth, vector<int>());
bfsLevelOrder(ret, depth - 1, root);
return ret;
}
void bfsLevelOrder(vector<vector<int>> &ret, int level, TreeNode *root)
{
if(!root)
return;
if(ret.size() <= level)
{
ret.insert(ret.begin(), {});
}
ret[level].push_back(root->val);
if(root->left)
bfsLevelOrder(ret, level - 1, root->left);
if(root->right)
bfsLevelOrder(ret, level - 1, root->right);
}
int dfsDepth(TreeNode* root)
{
if(!root)
return 0;
return max(dfsDepth(root->left), dfsDepth(root->right)) + 1;
}
};