题干
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
思路
对于这道题目来说因为对于一个二叉搜索树来说其本质上是对于根节点来说其左节点是小于其值,其右节点都是大于其值,所以我们在进行判断是否是二叉搜索时候(因为我们假定根节点是确定的),假设对于大于其的节点都是其左子树,然后遇到小于其值的节点认为是右子树,然后在认为的左子树里面查询是否有大于其的存在,若是没有认为(以当前的根节点中,左右子树是满足二叉搜索的情况的),然后再度进行递归的循环调用即可。
当然我们也可以更换思维,将数组的最后一个元素取出,认为小于其的都是左子树,然后大于其的地方都是右子树然后在右子树中判断是否有小于其的存在然后进行递归的调用。
代码
public class Solution {
public boolean VerifySquenceOfBST(int [] num) {
int len=num.length;
if(len==0)
return false;
return isbst(0,len-1,num);
}
private boolean isbst(int low,int high,int [] num){
if(high<=low)
return true;
int p=0;
int temp=num[high];
for(int i=high-1;i>=0;i--){
if(num[i]<temp){
p=i;
break;
}
}
for(int j=low;j<p;j++){
if(num[j]>num[high])
return false;
}
return isbst(low,p,num)&&isbst(p+1,high-1,num);
}
}
总结
明白二叉搜索特性与后序遍历特性,然后采用分治思想假定一方是正确的,因为是左右子树我们许假定一方是我们认为的样子,然后在另外一边进行特殊情况的判断。