
这道题可以用递归写,比较简单,但是 我想用非递归写,这是有点挑战难度的:


现在栈顶数据是 4,它的右子树为空,所以可以保存到vector中:

继续取出栈顶数据,也就是 2 ,它的右子树存在,并且prev不是它,所以 2 节点不能出栈,继续它的右子树:

由于 5的左右都为空,所以 5 就能直接出栈,并更新prev:

继续取出栈顶元素,判断它能不能出栈,发现它的右树是prev,所以它的右子树已经访问过了,它的左右子树都被访问,所以 它可以出栈,更新prev:




class Solution {
public:
vector<int> postorderTraversal(TreeNode* root)
{
stack<TreeNode*> stack_;
TreeNode* cur = root;
TreeNode* prev = nullptr;
vector<int> ret;
while(cur||!stack_.empty())
{
左 右 根
while(cur)
{
stack_.push(cur);
cur = cur->left;
}
TreeNode* top = stack_.top();
if(top->right==nullptr || top->right== prev)
{
ret.push_back(top->val);
prev = top;
stack_.pop();
}
else
{
cur = top->right;
}
}
return ret;
}
};