题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
思路:
数组的最后一个数为根,数组中比根小的连续数组部分为左子树,比根大的连续部分为右子树,若左子树部分存在数大于根或者右子树部分存在数小于根,则返回false,否则将左子树和右子树作为新的树,进行递归。
public class Solution {
public boolean VerifySquenceOfBST(int [] sequence) {
if(sequence.length==0)
return false;
return judge(sequence,0,sequence.length);
}
private boolean judge(int[] a,int l,int r){
// 左边界和右边界重合,则递归结束
if(l >= r)
return true;
// 用i保存记录左子树和右子树的边界
int i = r;
// 搜索连续大于根的数组部分,记录边界i
// 循环结束后,下标i到r-1的数都大于根
while(i > l && a[i-1] > a[r]){
--i;
}
// 判断左子树是否都小于根
for(int j=i-1;j >= l;--j){
if(a[j] > a[r])
return false;
}
return judge(a,l,i - 1) && judge(a,i,r-1);
}
}