LeetCode领扣 #107 二叉树的层次遍历II(Binary-Tree-Level-Order-Traversal-II)

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

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

    3
   / \
  9  20
    /  \
   15   7

返回其自底向上的层次遍历为:

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

思路:有丶复杂,但本质还是层次遍历,只是每一层的数据用一个vector<int>保存,而且结果要求从后往前。主要的想法还是:先来一个空的容器vector<vector<int> >res保存结果,若树为空树直接返回,否则执行算法。同样的,设一个队列,先将树根入队,然后进入循环。

首先将当前队列的n个元素逐个取出(需要记录个数n,这n个结点即为这一层的结点),然后将其左结点、右节点入队(NULL不要),同时将取出的结点保存到一个临时容器data中。这样内部循环结束后,队列中的是下一层的结点,data中的是这一层的结点。将data存入栈中(方便最后回弹,从后往前)。知道队列为空时结束算法,返回结果。

结果:此算法胜过100.00%的cpp(还可以^-^)

/**
 * 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) 
    {
        vector<vector<int> > res;
        if( root == nullptr ) 
            return res;	

        stack<vector<int> > tmp;
        queue<TreeNode*> que;
        que.push(root);
        while( !que.empty() )
        {
            vector<int> data;
            int n = que.size();
            while( n-- ){
                TreeNode* t = que.front();
                if( t->left ) que.push(t->left);
                if( t->right) que.push(t->right);
                data.push_back(t->val);
                que.pop();		
            }
            tmp.push(data);
        }
        while( !tmp.empty() ){
            res.push_back( tmp.top() );
            tmp.pop();
        }
        return res;	    
    }
};

猜你喜欢

转载自blog.csdn.net/Love_Irelia97/article/details/82872510