好巧的代码,赞叹

    1. /**
    2. * Definition for a binary tree node.
    3. * struct TreeNode {
    4. * int val;
    5. * TreeNode *left;
    6. * TreeNode *right;
    7. * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
    8. * };
    9. */
    10. class Solution {
    11. public:
    12. vector<int> preorderTraversal(TreeNode* root) {
    13. vector<int> res;
    14. stack<TreeNode*> stk;
    15. auto pt = root;
    16. while(pt || stk.size())
    17. {
    18. while(pt)
    19. {
    20. res.push_back(pt->val);
    21. stk.push(pt);
    22. pt = pt->left;
    23. }
    24. if(stk.size())
    25. {
    26. pt = stk.top();
    27. stk.pop();
    28. pt = pt->right;
    29. }
    30. }
    31. return res;
    32. }
    33. };

    第二次写题

    1. /**
    2. * Definition for a binary tree node.
    3. * struct TreeNode {
    4. * int val;
    5. * TreeNode *left;
    6. * TreeNode *right;
    7. * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
    8. * };
    9. */
    10. class Solution {
    11. public:
    12. vector<int> preorderTraversal(TreeNode* root) {
    13. vector<int> res;
    14. stack<TreeNode*> stk;
    15. auto pt = root;
    16. while(pt || stk.size())
    17. {
    18. while(pt)
    19. {
    20. res.push_back(pt->val);
    21. stk.push(pt);
    22. pt = pt->left;
    23. }
    24. if(stk.size())
    25. {
    26. pt = stk.top();
    27. stk.pop();
    28. pt = pt->right;
    29. }
    30. }
    31. return res;
    32. }
    33. };

    第三次写题
    递归的方式

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
        vector<int> res;
        void dfs(TreeNode* root)
        {
            if(!root) return;
            res.push_back(root->val);
            dfs(root->left);
            dfs(root->right);
        }
    public:
        vector<int> preorderTraversal(TreeNode* root) {
            dfs(root);
            return res;
        }
    };
    

    迭代的方式:
    这个写法很有意思

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        vector<int> preorderTraversal(TreeNode* root) {
            stack<TreeNode*> stk;
            vector<int> res;
            while(root || stk.size())
            {
                while(root)
                {
                    res.push_back(root->val);
                    stk.push(root);
                    root = root->left;
    
                }
                root = stk.top();
                stk.pop();
                root = root->right;
            }
            return res;
        }
    };
    

    Morris
    这里主要要注意的是,节点会走两次,第一次放入res,第二次不要放入res

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        vector<int> preorderTraversal(TreeNode* root) {
            vector<int> res;
            while(root)
            {
                if(!root->left)
                {
                    res.push_back(root->val);
                    root = root->right;
                }
                else
                {
                    auto tmp = root->left;
                    while(tmp->right && tmp->right != root) tmp = tmp->right;
                    if(tmp->right == root) 
                    {
                        tmp->right = nullptr;
                        root = root->right;
                    }
                    else{
                        res.push_back(root->val);
                        tmp->right = root;
                        root = root->left;
                    }
                }
            }
            return res;
        }
    };
    

    第三次写题

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        vector<int> preorderTraversal(TreeNode* root) {
            vector<int> res;
            stack<TreeNode*> stk;
            while(root || stk.size())
            {
                while(root)
                {
                    res.push_back(root->val);
                    stk.push(root);
                    root = root->left;
                }
                root = stk.top();
                stk.pop();
                root = root->right;
            }
            return res;
        }
    };
    

    Morris算法

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        vector<int> preorderTraversal(TreeNode* root) {
            vector<int> res;
            while(root)
            {
                if(!root->left)
                {
                    res.push_back(root->val);
                    root = root->right;
                }
                else
                {
                    TreeNode* tmp = root->left;
                    while(tmp->right && tmp->right != root) tmp = tmp->right;
                    if(tmp->right == root)
                    {
                        tmp->right = nullptr;
                        root = root->right;
                    }
                    else
                    {
                        res.push_back(root->val);
                        tmp->right = root;
                        root = root->left;
                    }
                }
            }
            return res;
        }
    };