题目

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

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

    3
   / \
  9  20
    /  \
   15   7

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

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

题解:

乍一看,好像需要很复杂的遍历,需要我们先到最底层,然后再往上整。但是我们会发现这个其实和按层次遍历的结果刚好相反,那么我们可以先按照层次遍历树,然后再将结果取反就行(或者先用一个栈存储结果)。

vector<vector<int>> levelOrderBottom(TreeNode* root) {
    //保存按照层次遍历的结果
    vector<vector<int> > res;
    //存储最终结果
    vector<vector<int> > r;
    //存储每一层的结果
    vector<int> tmp;

    if(root==NULL)
        return res;

    queue<TreeNode* > que;
    que.push(root);
    //记录每层的个数,这样就不用再开一个临时队列存储子节点,而是直接将子节点放到que中
    int i = que.size();

    while(!que.empty())
    {
        TreeNode* head = que.front();
        tmp.push_back(head->val);
        que.pop();
        i--;

        //添加左右子节点
        if(head->left!=NULL)
        {
            que.push(head->left);
        }
        if(head->right!=NULL)
        {
            que.push(head->right);
        }

        //该层遍历结束
        if(i==0)
        {
            res.push_back(tmp);
            tmp.clear();
            i = que.size();
        }
    }

    //将结果取反
    for(int i=res.size()-1;i>=0;i--)
    {
        r.push_back(res[i]);
    }

    return r;
}