剑指offer48

244 阅读1分钟

题目描述

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。

解题思路分析

  • 二叉搜索树的后序遍历序列,也就是说,序列的最后一个数字是该二叉搜索树的根节点
  • 然后从头至尾 - 1遍历,找到第一个比根节点大的数字的下标,然后从改下标开始到尾 - 1,看有没有出现比根节点小的数,如果有,则直接返回false,否则继续递归判断其左右子树

代码实现

public boolean verifySequenceOfBST(int[] seq) {
    if (seq == null || seq.length <= 0) {
        return false;
    }
    return verifySequenceOfBST(seq, 0, seq.length - 1);
}

private boolean verifySequenceOfBST(int[] seq, int start, int end) {
    //如果子树中只剩一个数字了,那肯定为true
    if (start >= end) {
        return true;
    }
    //找到第一个比root大的
    int root = seq[end], i;
    for (i = start, i < end; i++) {
        if (seq[i] > root) {
            break;
        }
    }
    int j = i + 1;
    //判断右子树有没有比root小的,有的话直接返回false
    for (; j < end; j++) {
        if (seq[j] < root) {
            return false;
        }
    }
    //递归判断左右子树
    return verifySequenceOfBST(seq, start, i - 1) && verify(seq, i, end - 1);
}