给定一个二叉树,返回其节点值自底向上的层序遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)。

示例 1:

二叉树的层序遍历Ⅱ-107 - 图1

  1. Input: root = [3,9,20,null,null,15,7]
  2. Output: [[15,7],[9,20],[3]]

示例 2:

  1. Input: root = [1]
  2. Output: [[1]]

示例 3:

  1. Input: root = []
  2. Output: []

提示:

  • -1000 ≤ Node.val ≤ 1000
  • 树中的节点数在[0,2000]范围内

思路

本题在102题:二叉树的层序遍历基础上修改。前几步和原来一样,到了最后一步,我们把结果从屁股到脑袋抄到一个新数组里,用空间换时间。或者调用reverse()函数对原来的结果进行反转。

代码

  1. /**
  2. * Definition for a binary tree node.
  3. * struct TreeNode {
  4. * int val;
  5. * TreeNode *left;
  6. * TreeNode *right;
  7. * TreeNode() : val(0), left(nullptr), right(nullptr) {}
  8. * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
  9. * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
  10. * };
  11. */
  12. class Solution {
  13. public:
  14. vector<vector<int>> levelOrderBottom(TreeNode* root) {
  15. vector< vector<int> > ans;
  16. if( root == nullptr ) return ans;
  17. if( root->left == nullptr && root->right == nullptr ) {
  18. vector<int> tmp(1, root->val);
  19. ans.emplace_back(tmp);
  20. return ans;
  21. }
  22. queue<TreeNode*> Q;
  23. Q.push(root);
  24. while( !Q.empty() ) {
  25. int walk_length = Q.size();
  26. vector<int> layer;
  27. for(int i = 0; i < walk_length; i++) {
  28. TreeNode* cur = Q.front();
  29. Q.pop();
  30. layer.emplace_back( cur->val );
  31. if( cur->left != nullptr ) Q.push( cur->left );
  32. if( cur->right != nullptr ) Q.push( cur->right );
  33. }
  34. ans.emplace_back( layer );
  35. }
  36. // Copy to a new vector in reverse order
  37. vector< vector<int> > res;
  38. for(int i = ans.size()-1; i >= 0; i--) {
  39. res.emplace_back( ans[i] );
  40. }
  41. return res;
  42. }
  43. };