题目大意:用迭代法返回二叉树的逆序遍历
代码:
/**
* 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) {
if(!root) return {};
vector<int> ans;
stack<TreeNode*> s;
unordered_set<TreeNode*> visited; // 记录已经访问的结点
s.push(root);
while(!s.empty()){
TreeNode* top = s.top();
bool leftVisited = true,rightVisited = true;
//先压右节点
if(top->right && visited.find(top->right) == visited.end()) {
rightVisited = false;
s.push(top->right);
}
//再压左节点
if(top->left && visited.find(top->left) == visited.end()) {
leftVisited = false;
s.push(top->left);
}
if(leftVisited && rightVisited) { // 左右结点已经访问过了,才可以访问当前结点
ans.push_back(top->val);
visited.insert(top);
s.pop();
}
}
return ans;
}
};