Post Order Traversal - LeetCode

后序遍历:左右中。
思路1:
—————–,1
————–,2
————,3
———-4.
————,5
———-6

设置一个指针。(参考binary search tree iterator)
1)一直往左下找,找到最左下的元素(例如,1-4)。过往的元素入栈。
2)每次到了最左下以后就查看是否有右节点。(例如,4有右节点5)
i 如果有还要继续(从右节点), 返回第一步。(例如5-6)
ii 如果没有,出栈当前元素,记录结果,并且当前元素记为pre。
3)注意,对于2)如果右节点已经是pre了(回溯上来了!)就如ii继续出栈。

时间复杂度:
O(n) 空间复杂度:O(n)

Code (C++):

class Solution {
public:
    vector<int> postorderTraversal(TreeNode *root) {
        vector<int> res;
        if(root == NULL) return res;
        stack<TreeNode *> st;
        TreeNode *pre = NULL;

        while(!st.empty() || root!=NULL)
        {
            if(root!=NULL)
            {
                st.push(root);
                root = root->left;

            }
            else
            {
                TreeNode * topNode = st.top(); 
                if(topNode->right!=NULL && pre!=topNode->right) 
                {
                    root = topNode->right; 
                }
                else{ 
                    st.pop();
                    res.push_back(topNode->val);// if pre == topNode, means it is going up. store right.
                    pre = topNode;
                }

            }
        }
    }
};

思路2:
用两个stack来存储。
s2: root,
s1: left, right
在出栈s1的时候,弹到s2中。使得s2中刚好是postorder的顺序。
s2: root(l1), right(root l2), left(root l2)
最终结果就是s2依次弹出栈顶元素的顺序。

时间复杂度:
O(n)遍历一边,空间复杂度:O(n);

class Solution {
public:
    vector<int> postorderTraversal(TreeNode* root) {
        vector<int> res;
        if(root == NULL) return res;
        stack<TreeNode *> stk;
        stack<TreeNode *> stk2;
        stk.push(root);
        while(!stk.empty())
        {
            TreeNode * cur = stk.top();
            stk.pop();
            stk2.push(cur);
            if(cur->left!=NULL)
            {
                stk.push(cur->left);
            }
            if(cur->right!=NULL)
            {
                stk.push(cur->right);
            }
        }
        while(!stk2.empty())
        {
            res.push_back(stk2.top()->val);
            stk2.pop();
        }
        return res;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值