//借助了先序非递归的方法,第一个循环就是对先序的改写了
//先序遍历时,弹出栈顶节点就访问,然后先压右孩子再压左孩子,循环直到栈空
//改写如下:
//如果每次弹出栈顶元素就访问,并且先压左孩子再压右孩子,那么整体的访问顺序就是头右左;而后续遍历的顺序是啥?
//不就是左右头嘛?和头右左是逆序的,那我们在每次弹出栈顶元素不访问,将它压入另一个栈,另一个栈的顺序就是后续遍历了
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
stack<TreeNode*> s1,s2;
vector<int> v;
if(root==nullptr) return v;
s1.push(root);
//先序遍历改写
while(!s1.empty())
{
TreeNode* t = s1.top();
s1.pop();
s2.push(t);//弹出不访问,压入s2
if(t->left)//先压入左
s1.push(t->left);
if(t->right)//再压入右
s1.push(t->right);
}
while(!s2.empty())//访问s2
{
v.push_back(s2.top()->val);
s2.pop();
}
return v;
}
};