/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
*/
class Solution {
public:
    vector<vector<int> > Print(TreeNode* pRoot) {
        vector<vector<int> > ret;
        if(!pRoot) return ret;
        stack<TreeNode*> st;
        st.push(pRoot);
        bool flag = false;
        
        while(!st.empty()){
            stack<TreeNode*> t;
            vector<int> res;
            while(!st.empty()){
                TreeNode* tem = st.top();
                res.push_back(tem->val);
                st.pop();
                if(flag){
                    if(tem->right) t.push(tem->right);
                    if(tem->left) t.push(tem->left);
                }else{
                    if(tem->left) t.push(tem->left);
                    if(tem->right) t.push(tem->right);
                }
            }
            flag = !flag;
            swap(st,t);
            ret.push_back(res);
        }
        
        return ret;
    }
    
};