剑指offer-二叉搜索树的后序遍历序列
题目描述:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
思路:
根据二叉搜索树的性质,左子树都比根小,右子树都比根大.
首先找到根结点,也就是最后一位,然后再找到左右子树的分隔处,然后递归判断左右子树
存在一个疑问,数组为空,到底是true还是false?我觉得应该是true
但在剑指offer给出的代码上,首先判断数组长度,若为0则返回false.但是在后面递归找子树的时候,却又判断了子数组的大小,若<=0,则返回true. 确实有点看不懂这操作
code
public boolean VerifySquenceOfBST(int [] sequence) {
if(sequence==null || sequence.length==0) {
return false;
}
if(sequence.length==1) {
return true;
}
int len=sequence.length;
int root=sequence[len-1];
int pos=0;
for(;pos<len-1;++pos) {
if(sequence[pos]>root) {
break;
}
}
int r=pos;
for(;r<len-1;++r) {
if(sequence[r]<root) {
return false;
}
}
return pos>0?VerifySquenceOfBST(Arrays.copyOfRange(sequence,0,pos)):true
&& (len-1-pos)>0?VerifySquenceOfBST(Arrays.copyOfRange(sequence,pos,len-1)):true;
}