/**
 * struct TreeNode {
 *    int val;
 *    struct TreeNode *left;
 *    struct TreeNode *right;
 * };
 */

class Solution {
public:

    /**
     * 
     * @param root TreeNode类 the root of binary tree
     * @return int整型vector<vector<>>
     */

    // 定义三个一维数组
    vector<int> pre;
    vector<int> in;
    vector<int> pos;



    // 递归函数一
    void preorder(TreeNode* root)
    {
        if(root != nullptr)
        {
            pre.push_back(root->val);
            preorder(root->left);
            preorder(root->right);
        }
    }

    // 递归函数二
    void inorder(TreeNode* root)
    {
        if (root != nullptr)
        {
            inorder(root->left);
            in.push_back(root->val);
            inorder(root->right);
        }
    }

    // 递归函数三
    void posorder(TreeNode* root)
    {
        if (root != nullptr)
        {
            posorder(root->left);
            posorder(root->right);
            pos.push_back(root->val);
        }
    }



    // 迭代函数一(使用了一个栈)
    void preorder2(TreeNode* root)
    {
        if (root != nullptr)
        {
            stack<TreeNode*> stk1;
            stk1.push(root);

            while(!stk1.empty())
            {
                root = stk1.top(); // 用root方便进行表示
                pre.push_back(root->val);
                stk1.pop();

                if (root->right != nullptr)
                    stk1.push(root->right);
                if (root->left != nullptr)
                    stk1.push(root->left);
            }
        }
    }

    // 迭代函数二(使用了一个栈)
    void inorder2(TreeNode* root)
    {
        if (root != nullptr)
        {
            stack<TreeNode*> stk1;

            while(!stk1.empty() || root != nullptr)
            {
                if (root != nullptr)
                {
                    stk1.push(root);
                    root = root->left;
                }
                else
                {
                    root = stk1.top();
                    in.push_back(root->val);
                    stk1.pop();
                    root = root->right;
                }
            }
        }
    }


    // 迭代函数三(使用了两个栈)
    void posorder2(TreeNode* root)
    {
        if (root != nullptr)
        {
            stack<TreeNode*> stk1;
            stack<TreeNode*> stk2; // 第二个栈起到了反序的作用
            stk1.push(root);

            while(!stk1.empty())
            {
                root = stk1.top();
                stk2.push(root);
                stk1.pop();

                if (root->left != nullptr)
                    stk1.push(root->left);
                if (root->right != nullptr)
                    stk1.push(root->right);
            }
            while(!stk2.empty())
            {
                pos.push_back(stk2.top()->val);
                stk2.pop();
            }
        }
    }



    vector<vector<int> > threeOrders(TreeNode* root) {
        // write code here

        // 二维数组的操作
        vector<vector<int>> res;

        preorder2(root);
        res.push_back(pre);

        inorder2(root);
        res.push_back(in);

        posorder2(root);
        res.push_back(pos);

        return res;

    }
};