输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
public class Solution {
public boolean _VerifySquenceOfBST(int [] sequence,int start,int end){
if(start >= end)
return true;
int root = sequence[end];
int i = start;
while(i < end){
if(sequence[i] > root)
break;
i++;
}
int j = i;
while(j < end){
if(sequence[j] < root)
return false;
j++;
}
return _VerifySquenceOfBST(sequence,start,i-1) && _VerifySquenceOfBST(sequence,i,end-1);
}
public boolean VerifySquenceOfBST(int [] sequence) {
if(sequence.length == 0)
return false;
return _VerifySquenceOfBST(sequence,0,sequence.length-1);
}
}
还有疑问,最终的结束条件为什么start == end 就不行呢?当案例为{4,6,7,5}的时候就可以看到:
(此时start为0,end为3)
一开始i处的值为1,左边4的是start为0,i-1为0,下一次递归的start和end是一样的,true!
右边,start为1,end-1为2,是{6,7}元素,下一轮递归是:
————7为root,i的值指向7,
————所以左边为6,start和i-1都指向6,返回true。
————右边i指向7,end-1指向6,这时候end > start!
我使用四个下标分别标记两个数组的开始和结束也是不行.应该也是同样的作用吧!
关键的点是:别忘了i的作用,考虑或者测试的时候不能只想着函数开始时候的start和end,还得考虑调用处的两个值,关键的还有i的取值,因为它影响着这两个值!
参考:
https://blog.csdn.net/u013238950/article/details/50827977