1. 程式人生 > >LeetCode:二叉樹的後序遍歷(遞迴與非遞迴法)

LeetCode:二叉樹的後序遍歷(遞迴與非遞迴法)

二叉樹結點類:

struct TreeNode
{
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x): val(x), left(NULL), right(NULL) {}
};

遞迴法: 

class Solution{

public:

    void postOrder(TreeNode *root, vector<int> &vec)
    {
        if(root != NULL)
        {
            postOrder(root->left, vec);
            postOrder(root->right, vec);
            vec.push_back(root->val);
        }
    }

    vector<int> postorderTraversal(TreeNode *root)
    {
        vector<int> vec;
        postOrder(root, vec);
        return vec;
    }

非遞迴法:

藉助棧來實現後序遍歷(左右根):

1、首先將根結點壓進棧底,進入while()迴圈

2、在while()迴圈中取出棧頂元素,並將該元素的值插入到vector型別的變數res的頭部。

3、首先判斷該棧頂元素的左結點是否為空,不為空則將該左結點壓入棧中;再判斷該棧頂元素的右結點是否為空,不為空則將該右結點壓入棧中。在下一輪迴圈中(進入第2步)就會首先取出棧頂元素即右結點,並將右結點插入到res的頭部。

4、直到棧中無元素可取,停止迴圈。

class Solution {
public:
    
    
    vector<int> postorderTraversal(TreeNode *root) {
        vector<int> res;
        if(root == NULL)
            return res;
        stack<TreeNode *> st;
        st.push(root);
        while(st.size())
        {
            TreeNode *temp = st.top();
            st.pop();
            res.insert(res.begin(),temp->val);
            if(temp->left)
                st.push(temp->left);
            if(temp->right)
                st.push(temp->right);
        }
        //reverse(res.begin(), res.end());
        return res;
    }
};