import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int[] array = new int[n];
        for (int i = 0; i < n; i++) {
            array[i] = in.nextInt();
        }
        System.out.println(isPost(array, 0, n - 1));
    }

    /**
     * @param array 序列
     * @param first 起始位置
     * @param last  结束位置
     * 0 <= first <= last < array.length
     * @return 是否为二叉搜索树的后序序列
     */
    private static boolean isPost(int[] array, int first, int last) {
        /**
         *                        等价于
         * 左侧均为小值,右侧均为大值 ------> 最后一个小值的位置 + 1 = 第一个大值的位置
         *
         * 详细情况讨论:
         * 情况一:既有左子又有右子
         * 情况一:只有左子
         * 情况二:只有右子
         * 情况四:既没有左子也没有右子
         *
         */
        int less = first - 1;
        int more = last;
        for (int i = first; i < last; i++) {
            if (array[i] < array[last]) {
                less = i;
            } else {
                more = more == last ? i : more;
            }
        }
        return less + 1 == more
                && (less < first || isPost(array, first, less))
                && (more == last || isPost(array, more, last - 1));
    }
}

判断一个序列是否为二叉搜索树的后序遍历序列

序列结构:| left(值<根)| right(值>根)| head |

isPost(array) :
    return 左子序列的最后一个位置 + 1 == 右子序列的第一个位置 & isPost(left) & isPost(right)

多种情况


1. 根节点既有左子也有右子(节点3)
2. 根节点只有左子(节点 2)
3. 根节点只有右子(节点 4)
4. 只有根节点(节点 1、5)