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; } };