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> postorderTraversal(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. stk.push(pt);
    21. auto tmp = pt;
    22. pt = pt->left;
    23. tmp->left = nullptr;
    24. }
    25. if(stk.size())
    26. {
    27. pt = stk.top();
    28. if(!pt->left && !pt->right)
    29. {
    30. res.push_back(pt->val);
    31. stk.pop();
    32. pt = nullptr;
    33. }
    34. else
    35. {
    36. auto tmp = pt;
    37. pt = pt->right;
    38. tmp->right = nullptr;
    39. }
    40. }
    41. }
    42. return res;
    43. }
    44. };

    第二次写题
    递归的写法

    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. vector<int> res;
    12. void dfs(TreeNode* root)
    13. {
    14. if(!root) return;
    15. dfs(root->left);
    16. dfs(root->right);
    17. res.push_back(root->val);
    18. }
    19. public:
    20. vector<int> postorderTraversal(TreeNode* root) {
    21. dfs(root);
    22. return res;
    23. }
    24. };

    迭代的写法:

    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> postorderTraversal(TreeNode* root) {
    13. stack<TreeNode*> stk;
    14. vector<int> res;
    15. while(root || stk.size())
    16. {
    17. while(root)
    18. {
    19. stk.push(root);
    20. TreeNode* tmp = root;
    21. root = root->left;
    22. tmp->left = nullptr;
    23. }
    24. if(stk.size())
    25. {
    26. root = stk.top();
    27. if(!root->left && !root->right)
    28. {
    29. res.push_back(root->val);
    30. stk.pop();
    31. root = nullptr;
    32. }
    33. else if(root->right)
    34. {
    35. TreeNode* tmp = root;
    36. root = root->right;
    37. tmp->right = nullptr;
    38. }
    39. }
    40. }
    41. return res;
    42. }
    43. };

    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> postorderTraversal(TreeNode* root) {
            stack<TreeNode*> stk;
            vector<int> res;
            while(root|| stk.size())
            {
                while(root)
                {
                    stk.push(root);
                    TreeNode* tmp = root;
                    root = root->left;
                    tmp->left = nullptr;
                }
                root = stk.top();
                if(!root->right)
                {
                    res.push_back(root->val);
                    root = nullptr;
                    stk.pop();
                }
                else
                {
                    TreeNode* tmp = root;
                    root = root->right;
                    tmp->right = nullptr;
                }
            }
            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> postorderTraversal(TreeNode* root) {
            stack<TreeNode*> stk;
            vector<int> res;
            while(root || stk.size())
            {
                while(root)
                {
                    stk.push(root);
                    TreeNode* tmp = root;
                    root = root->left;
                    tmp->left = nullptr;
                }
                root = stk.top();
                if(root->right)
                {
                    TreeNode* tmp = root;
                    root = root->right;
                    tmp->right = nullptr;
                }
                else{
                    stk.pop();
                    res.push_back(root->val);
                    root = nullptr;
                }
            }
            return res;
        }
    };