剑指offer第33题二叉搜索树的后序遍历序列
**思路:**递归的形式解题
basecase : 如果左边界大于等于右边界了,return true,之上而下进行搜索,当搜索到二叉树的底部还没有结束时,说明他就是一个二叉搜 索树,必须要加,要不然会越界的
应用了二叉搜索树后续遍历的特性,最后一个值为根节点,比根节点小的树为左子树,比根节点大的为右子树,找到一个比根节点大的树的时候,记录当前索引的位置,这个索引的前面就都是左子树,循环判断后续节点的值,如果有一个数值比根节点小了,返回false,不是一颗二叉搜索树,或者不是二叉搜索树的后续遍历;
接着分治,左子树和右子树是不是满足条件,感觉写的多了,慢慢的感觉就有一点来了,你别说,思路很清晰
class Solution {
public boolean verifyPostorder(int[] postorder) {
return verify(postorder,0,postorder.length - 1);
}
public boolean verify(int[] postorder,int left,int right){
if(left >= right){
return true;
}
int k = left;
int rootvalue = postorder[right];
while(k < right && postorder[k] < rootvalue){
k++;
}
for (int i = k;i < right;i++){
if (postorder[i] < rootvalue){
return false;
}
}
//检查左子树
if(!verify(postorder,left,k - 1)){
return false;
}
if(!verify(postorder,k,right - 1)){
return false;
}
return true;
}
}