我的算法8

題目地址https://leetcode.com/problems/binary-tree-postorder-traversal/#/description

題目描述:Given a binary tree, return the postorder traversal of its nodes’ values.
Note: Recursive solution is trivial, could you do it iteratively?

我的代碼

/**
 * 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) {
        vector<int> tree;
        vector<TreeNode*> node; 
        if(root==NULL) return tree;
        TreeNode* now;
        node.push_back(root);
        while(!node.empty()){
            now=node.back();
            tree.insert(tree.begin(),now->val);
            node.pop_back();
            if(now->left) node.push_back(now->left);
            if(now->right) node.push_back(now->right);
        }
        return tree;
    }
};

解題思路
題目要求用迭代的方法後序遍歷二叉樹。將遍歷的結果從後往前看,可知根節點在最末尾,然後是右子樹,再是左子樹。由此,迭代時逐步從後往前先右後左的加入子樹根節點即可。
但顯然的問題是,在加入右子樹的根節點時,必須維護各層左子樹根節點的順序,所有采用另一個vector來保存所經過節點的子節點,即每次將該vector的最後一個節點加入後續遍歷的結果最前面並在vector中刪除此節點,然後將該節點的左右子節點加入vector中,注意,必須先左後右,如此在下一步使用時纔會先右後左,符合我們之前分析的順序。這樣當保存完整個右子樹後,自然會轉到對應的左子樹。(這一點通過觀察葉節點就很容易明白。)
如此,我們在程序中只遍歷了這個樹一遍,複雜度是O(n)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章