思路

  1. 后序遍历|左子树|右子树|根节点|
  2. 二叉搜索树的定义是左子树 < 根节点 < 右子树 (或者左子树 > 根节点 > 右子树)
  3. 因此可以递归判断是否符合二叉搜索树定义
    • 数组边界为left right,根元素为root = array[right]
      • 从left进行遍历,一直到array[index] > root,这样left ~ index - 1为左子树范围,index ~ right - 1 为右子树范围,递归判断左右子树是否符合定义
class Solution {
    public boolean verifyPostorder(int[] postorder) {
        return verify(postorder, 0, postorder.length -1);
    }

    boolean verify(int[] postorder, int left, int right) {
        if (left >= right) return true;
        int root = postorder[right];
        // 左右子树分界线
        int index = left;
        for(int k = left ; k < right; k++) {
            if (postorder[k] < root) {
                index = k;
            } else break;
        }
        // 检查右子树是否符合定义
        for (int k = index + 1; k < right ;k++) {         
            if (postorder[k] < root) return false;
        }
        // 递归检查左右子树
        return verify(postorder,left, index) && verify(postorder, index + 1, right - 1);
    }
}

Q.E.D.


每一个平凡的日常都是连续的奇迹