【LeetCode-树】二叉树的层次遍历 II

题目描述

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

例如:
给定二叉树 [3,9,20,null,null,15,7],

    3
   / 
  9  20
    /  
   15   7
返回其自底向上的层次遍历为:

[
  [15,7],
  [9,20],
  [3]
]

题目链接: https://leetcode-cn.com/problems/binary-tree-level-order-traversal-ii/

思路

先使用常规的层次遍历方法自上而下遍历,并将结果存在二维数组 ans 中,然后对 ans 进行调整即可。调整的方法是使用两个指针 left、right,left 从前往后移动,right 从后往前移动,每次移动一个位置,交换 ans[left] 和 ans[right],重复这个过程直到 left>=right。具体代码如下:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    vector<vector<int>> levelOrderBottom(TreeNode* root) {
        if(root==nullptr) return {};

        queue<TreeNode*> q;
        q.push(root);
        vector<vector<int>> ans;
        while(!q.empty()){
            int n = q.size();
            vector<int> curLevel;
            for(int i=0; i<n; i++){
                TreeNode* node = q.front(); q.pop();
                curLevel.push_back(node->val);
                if(node->left!=nullptr) q.push(node->left);
                if(node->right!=nullptr) q.push(node->right);
            }
            ans.push_back(curLevel);
        }

        int left = 0;
        int right = ans.size()-1;
        while(left<right){
            swap(ans[left], ans[right]);
            left++;
            right--;
        }
        return ans;
    }
};
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)
原文地址:https://www.cnblogs.com/flix/p/13290553.html