思路:
1.递归,左 右 根 ,最后加节点数据
2.栈, 能不能用一个栈 来将数据成 根 右 左 这样添加进去,然后取出来就是我们想要的左 右 根了
当然有,先由一个栈不断添加左 右节点,然后栈顶是右节点,再遍历这个右节点,每次添加 它的左右 节点。同时在循环的时候不断用新栈添加当前节点。看代码取画个图吧,画个不被定义的图,很容易理解。

import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 *   public TreeNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param root TreeNode类
     * @return int整型一维数组
     */
    public int[] postorderTraversal (TreeNode root) {
        // write code here
        if (root == null ) {
            return new int[] {};
        }
        //左右根
        ArrayList<Integer> result = new ArrayList<>();
        inOrderBFS(root, result);
        return result.stream().mapToInt(Integer::intValue).toArray();

    }
    private void inOrder(TreeNode node, ArrayList<Integer> result) {
        if (node == null) {
            return;
        }

        inOrder(node.left, result);
        inOrder(node.right, result);
        result.add(node.val);
    }

    private void inOrderBFS(TreeNode node, ArrayList<Integer> result) {
        if (node == null) {
            return;
        }

        Stack<TreeNode> s1 = new Stack<>();
        Stack<TreeNode> s2 = new Stack<>();

        s1.push(node);
        TreeNode currentNode = null;

        while (!s1.empty()) {
                currentNode = s1.pop();
                s2.push(currentNode);
                if(currentNode.left != null){
                    s1.push(currentNode.left);
                }
            if(currentNode.right != null){
                s1.push(currentNode.right);
            }
        }
        while(!s2.empty()){
            result.add(s2.pop().val);
        }

    }
}