解题思路:
分治
public class Solution {
// 验证给定的后序遍历数组是否可以来自一个二叉搜索树(BST)
public boolean verifyTreeOrder(int[] postorder) {
// 调用递归方法来验证整个postorder数组
return verify(postorder, 0, postorder.length - 1);
}
// 递归方法,用于验证数组的一部分是否可以是BST的后序遍历
boolean verify(int[] postorder, int left_start, int rootIndex) {
// 递归结束条件:如果当前部分为空或只有一个节点,它是有效的
if (left_start >= rootIndex)
return true;
// 初始化一个指针来遍历数组
int p = left_start;
// 寻找左子树的结束点,左子树所有节点的值都要小于根节点
while (postorder[p] < postorder[rootIndex])
p++;
// 记录右子树开始的位置
int right_start = p;
// 继续移动指针,检查右子树中的节点是否都大于根节点
while (postorder[p] > postorder[rootIndex])
p++;
// 验证我们是否达到了子数组的末尾
// 并且递归验证左、右子树
return p == rootIndex && verify(postorder, left_start, right_start - 1) &&
verify(postorder, right_start, rootIndex - 1);
}
}