题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
解题思路
- 递归大法好
- 如果start == end,则说明数组为空,返回true
- 如果start > end,则说明递归到过程中对空数组进行了判断,直接返回true;
- 找到数组的从start到end中,第一个大于sequence[end-1]的元素的index,如果是二叉搜索树的话,则sequence[index]到sequence[end-1-1]的元素都应该小于sequence[end-1],sequence[start]到sequence[index-1]的元素都应该大于sequence[end-1],如果不满足这个条件,直接返回false,如果满足,则判断子数组是否是二叉搜索树。
代码
public class Solution {
public boolean VerifySquenceOfBST(int [] sequence) {
if(sequence == null || sequence.length == 0) return false;
return VerifySquenceOfBST(sequence, 0, sequence.length);
}
private boolean VerifySquenceOfBST(int [] sequence, int start, int end) {
if(start >= end) return true;
int index = findIndex(start, end, sequence);
boolean flag = true;
if(index < end - 1){
for(int i = index; i < end - 1; i++){
flag = flag && (sequence[i] > sequence[end - 1]);
}
}
if(index > start){
for(int i = start; i < index; i++){
flag = flag && (sequence[i] < sequence[end - 1]);
}
}
if(flag) return VerifySquenceOfBST(sequence, index, end-1) && VerifySquenceOfBST(sequence, start, index-1);
return false;
}
private int findIndex(int start, int end, int[] sequence){
for(int i = start; i < end; i++){
if(sequence[i] > sequence[end-1]) return i;
}
return end - 1;
}
}