/**
 * struct TreeNode {
 *    int val;
 *    struct TreeNode *left;
 *    struct TreeNode *right;
 *    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param root TreeNode类 
     * @return int整型vector
     */
    vector<int> vec;
    //下面再介绍一种二叉树的神级遍历方法->Morris遍历
    //Morris遍历可以做到时间复杂度为O(N)空间复杂度为O(1)
    vector<int> preorderTraversal(TreeNode* root) {
        // write code here
        if(root==NULL)//为空直接返回
            return vec;
        TreeNode*cur=root;
        while(cur){//当cur不为空时
            TreeNode*mostRight=cur->left;
            if(mostRight){//如果当前节点有左子树,则找到左子树上的最右节点
                while(mostRight->right&&mostRight->right!=cur){
                    mostRight=mostRight->right;
                }
                if(!mostRight->right){//mostRight的右孩子是空节点,说明此时是第一次遇到cur这个节点,将其放入vec中
                    mostRight->right=cur;//并且将其右孩子节点指向cur节点
                    vec.push_back(cur->val);
                    cur=cur->left;
                }
                else{//说明此时是第二次遇到cur节点,此时将指针调整回来
                    mostRight->right=NULL;
                    cur=cur->right;
                }
            }
            else{//说明当前节点cur没有左子树,此时直接将其放入vec中,因为不会再遇到cur了
                vec.push_back(cur->val);
                cur=cur->right;
            }
        }
        return vec;
    }
};