leetcode在線編程binary-tree-postorder-traversal

leetcode在線編程binary-tree-postorder-traversal

題目鏈接

binary-tree-postorder-traversal

題目描述

Given a binary tree, return the postorder traversal of its nodes’ values.
For example:
Given binary tree{1,#,2,3},
1
\
2
/
3

return[3,2,1].
Note: Recursive solution is trivial, could you do it iteratively?:


題意

通過題目所給的樹,求出其後根遍歷,並將結點的val值壓入vector中,建議用通過非遞歸方式實現

解題思路

通過棧去模擬遞歸,首先要明確後根遍歷,必須先遍歷完左子樹與右子樹之後,才訪問根節點。當前遍歷的節點分有子樹和沒子樹兩種,沒子樹自然直接可以加入vector中,而有的呢,有一種處理方法,將後根遍歷的前一個節點保存起來,若此節點不是當前遍歷節點的左右子樹,證明當前節點左右子樹還沒被訪問到。
爲此我們可以分3種情況
1.棧頂的節點沒有左右子樹,證明此節點可以直接訪問,就讓此節點出棧,並將其的val值放入vector容器中,並將其值設爲前驅節點的值
2.棧頂節點有左右子樹,判斷當前前驅節點是否爲棧頂節點左右子樹,是的話便可以出棧,並將其的val值放入vector容器中,並將其值設爲前驅節點的值
3.棧頂的節點有左右子樹,且不滿足上述2條件,我們依次將右子樹,左子樹壓入棧中(這樣便可以保證,在遍歷到根節點時,總能先訪問到左子樹,右子樹)

AC代碼

/**
 * Definition for binary tree
 * 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) {
        vector<int> v;
        if(root==NULL)
            return v;
        stack<TreeNode *> sta;
        TreeNode *pre =NULL; //前驅遍歷頂點
        sta.push(root);
        while(!sta.empty())
        {
            TreeNode *tmp = sta.top();
            if((tmp->left==NULL&&tmp->right==NULL)||(pre!=NULL&&(tmp->left==pre||tmp->right==pre)))
            {
                v.push_back(tmp->val);
                sta.pop();
                pre = tmp;
            }
            else
            {
                if(tmp->right!=NULL)
                    sta.push(tmp->right);
                if(tmp->left!=NULL)
                    sta.push(tmp->left);    
            }
        }
        return v;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章