/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
*/
#include <queue>
#include <vector>
class Solution {
public:
// 用来反转vector操作
    vector<int> reverse(vector<int> it)
    {
        vector<int> jt;
        // 遍历vector的全部数据有顺序和逆序
        // 如果顺序的话是begin到end
        // 如果是逆序的话是end-1到begin-1
        // 这是因为end指向的是vector后一个数据,要从end-1开始。同样的,逆序的begin应该也指向顺序begin前一个数据,也就是begin-1
        // begin=0,end=n
        for (auto k=it.end()-1; k!=it.begin()-1; k--) {
            jt.push_back(*k);
        }
        return jt;
    }

// 这就是层序遍历,参考上一篇文章
    vector<vector<int> > Print(TreeNode* pRoot) {
        vector<vector<int> > vec;
        if(pRoot==nullptr)return vec;
        queue<TreeNode*> qu;
        TreeNode *node=pRoot;
        qu.push(node);
        // 本来还想着通过存储在队列的方式来改变输出vector,但我发题目的规律后发现奇数层是反转的,那直接层序遍历修改一下不就好咯!所以就没必要再在这里耗下去了,转化思路!
        // int count=1;
        while (qu.empty()==false) {
            vector<int> temp;
            int _size = qu.size();
            for (int i=0; i<_size; ++i) {
                node=qu.front();
                qu.pop();
                temp.push_back(node->val);
                if (node->left!=nullptr) {
                    qu.push(node->left);
                }
                if(node->right!=nullptr)
                {
                    qu.push(node->right);
                }
            }
            // count++;
            vec.push_back(temp);
            temp.clear();
        }
        // return vec;
        vector<vector<int> > final;
        for (int j=0; j<vec.size(); j++) {
            if (j%2==1) {
                vector<int> mid=reverse(vec[j]);
                final.push_back(mid);
            }else{
                final.push_back(vec[j]);
            }
        }
        vec.clear();
        return final;
    }
    
};