如果是前序遍历,我们的顺序是根节点,左节点,右节点。如果我们用一个栈来实现,可以这样考虑:先把根节点压入栈,在栈中有元素的时候循环:每次弹出栈顶元素,然后先压入栈顶元素的右边节点,再压入栈顶元素的左边节点。
因为栈是先进后出,因此要先压入右边的节点,因此第二次执行while循环的时候,栈顶元素就是左节点A,然后再来压入右节点A->R压入左节点A->L,注意,下一次循环的时候,谁是栈顶元素?没错,就是左节点。就是通过这种栈的特性,实现了递归的过程!
所以要能够理解,为什么有人说栈和递归是一样的。
以上过程实现了根、左、右的遍历过程,那我们想想后序遍历:左、右、根的的顺序,可不可以借鉴这个思路?可以的,我们只需要实现根、右、左的过程,再reverse一下,就OK了,是不是很骚,是的。
————————————————
原文链接:https://blog.csdn.net/ibelieve8013/article/details/103059101

import java.util.*;
public class Solution {
    private ArrayList<Integer> list = new ArrayList<>();
    public ArrayList<Integer> postorderTraversal(TreeNode root) {
        //迭代法 ,先实现根 右 左 再reverse
        //递归的本质就是栈
        if (root == null) return list;
        Stack<TreeNode> stk = new Stack<>();
        stk.push(root);
        while(!stk.isEmpty()){
            //栈顶出来
            TreeNode top = stk.pop();
            list.add(top.val);
            //压入左再压入右--->我们访问的顺序就是根 右 左
            if(top.left != null) stk.push(top.left);
            if(top.right!=null) stk.push(top.right);
        }
        Collections.reverse(list);
        return list;

    }
}