public void postOrder_Stack(TreeNode root) {
        TreeNode tmp = root;
        Stack<TreeNode> stack = new Stack<TreeNode>();
        while (root != null) {
            // 左子树入栈
            while(root.left != null){
                stack.push(root);
                root = root.left;
            }
            // 已遍历到最左，进行向上逐个输出左节点，遍历到中节点则退出
            while (root.right == null || root.right == tmp) {
                visit(root); // 左
                tmp = root;// 记录上一个已输出节点
                if (stack.empty())
                    return;
                root = stack.pop();
            }
            // 该节点有右节点(为中节点)，则存储中节点，对右节点进行重新遍历
            stack.push(root);
            root = root.right;
        }
    }