import java.util.*;
public class Solution {
// 二叉搜索树的后序遍历序列,判断某数组是否为某二叉搜索树的后序遍历
// 二叉搜索树特性:左子树的所有节点都小于根节点,右子树所有节点都大于根节点;中序遍历是有序的
// 后序遍历:左右根
// 数组中最后的节点一定是根节点
// 思路:根据最后一个节点时根节点,划分出左子树和右子树,左子树全部小于根节点,右子树全部大于根节点。划分完了之后,因为我们是根据第一个大于根节点的元素进行划分的,所以只需要验证划分出来的右子树全部大于根节点。之后递归进行这一过程
public boolean VerifySquenceOfBST(int [] sequence) {
if (sequence.length == 0) return false;
return Judge(sequence);
}
public boolean Judge(int[] sequence) {
if (sequence.length < 1) return true;
int i = 0;
int root = sequence[sequence.length - 1];
for (; i < sequence.length-1; i++) {
// 找到根节点
// 找到划分左右子树的点 i
if (sequence[i] > root) {
for (int j = i + 1; j < sequence.length - 1; j++) {
if (sequence[j] < root) {
return false;
}
}
}
}
// 递归遍历左子树
boolean left = Judge(Arrays.copyOfRange(sequence, 0, i));
// 递归遍历右子树
boolean right = Judge(Arrays.copyOfRange(sequence, i, sequence.length - 1));
return left && right;
}
}