Leetcode 145 二叉树的后序遍历 非递归

题目描述:

 题解:

关键点:用栈记录回溯路径,用map标记节点是否已经在后序vector中。

1. 对于每个节点而言,首先判断是否能够继续迭代,无法继续迭代的话存下该节点值,从栈中取出该节点的父节点。

2. 能够继续迭代的情况下,先迭代左子树,再迭代右子树。

AC代码:

class Solution {
public:
    vector<int> postorderTraversal(TreeNode* root) {
        if(root == NULL) return {};
        stack<TreeNode*> sta;
        int flag = 1;
        
        TreeNode* tmp = root;
        vector<int> ans;
        unordered_map<TreeNode*,int> mp;
        while(1)
        {
            if(flag == 1) flag = 0;
            if((tmp->left == NULL || mp.find(tmp->left)!= mp.end()) && (tmp->right == NULL || mp.find(tmp->right) != mp.end())) // 无法继续迭代 存下该节点的值
            {
                ans.push_back(tmp->val);
                mp[tmp] = 1;
                if(sta.size() == 0) break;
                tmp = sta.top();
                sta.pop();
                continue;
            }
            sta.push(tmp);
            if(tmp->left != NULL && mp.find(tmp->left) == mp.end()) // 向左子树迭代
            {
                tmp = tmp->left;
                continue;
            }
            if(tmp->right != NULL && mp.find(tmp->right) == mp.end()) // 向右子树迭代
            {
                tmp = tmp->right;
                continue;
            }
        }

        return ans;
    }
};
 
原文地址:https://www.cnblogs.com/z1141000271/p/12564732.html