因为是搜索二叉树,所以 左结点 < root < 右结点
先遍历找到 大于数组最后一个数(也就是root)的索引
则 [left,i-1]为右子树的区间,[i,right-1]为左子树的区间
判断右子树区间内的数是否都小于 root(也就是postorder[right])判断左子树区间内的数是否都大于 root
public class Offer33 {
private int[] postorder;
public boolean verifyPostorder(int[] postorder) {
this.postorder = postorder;
return helper(0,postorder.length - 1);
}
/** 创建一个方法,传入子树的左右区间,返回是否为后序遍历*/
public boolean helper(int left,int right){
/** 终止条件: 穿过叶子结点,即区间大小为0;*/
if (left >= right) return true;
/** 寻找左右子树的界限,*/
int i = left;
while (postorder[i] < postorder[right]){
i++;
}
/** 判断当前root结点的左右子树是否满足后序遍历,
* 其中左子树已经在寻找界限的时候已经满足了,所以只需要判读右子树即可*/
int j = i;
while (postorder[j] > postorder[right]){
j++;
}
Boolean flag = true;
if (j != right) flag = false;
/** 问题与子问题之间的联系:*/
return flag && helper(left,i-1) && helper(i,right-1);
}
}