题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
思路:所谓二叉搜索数,就是对于所有的节点,节点左边的子节点都小于该节点,节点右边的子节点都大于该节点。已知二叉搜索树的后序遍历,则数组的最后一个节点为根节点。遍历数组找到第一个比根节点大的下标,则该下标往后应该都是右子树,也就是说往后应该都比根节点大。根据这一点来对二叉树进行拆分和递归,确保对于每一个节点满足上述要求即可。
public class Solution {
public boolean VerifySquenceOfBST(int [] sequence) {
if(sequence!=null){
if(sequence.length>0){
//重载方法为了方便递归,增加了两个下标来限定数组,避免创建新的数组。
return VerifySquenceOfBST(sequence,0,sequence.length-1);
}
}
return false;
}
public boolean VerifySquenceOfBST(int [] sequence,int from,int to){
if(sequence.length>0&&to>from){//递归结束条件。如果某个子树遍历到只剩一个元素,那么这次遍历就是成功的。
int root = sequence[to];//根节点是数组的最后一个元素。
int index = from;
for(int i=from;i<=to;i++){
if(sequence[i]>=root){
index = i;//找到分界点
break;
}
}
//检查分界点右边所有的节点是否满足二叉搜索树的条件,然后递归。
return checkRight(sequence,index,to-1,root)&&VerifySquenceOfBST(sequence,from,index-1)&&VerifySquenceOfBST(sequence,index,to-1);
}
return true;
}
public boolean checkRight(int [] array,int from,int to,int root){
for(int i = from;i<=to;i++){
if(array[i]<root){
return false;
}
}
return true;
}
}