题目描述:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。
假设输入的数组的任意两个数字都互不相同。
思路:
找住二叉查找树(Binary Search Tree,BST)的特点:左子树<根<右子树
使用分治思想和递归思想
package swordToOffer._23_VerifySquenceOfBST;
public class Solution {
public boolean VerifySquenceOfBST(int [] sequence) {
if(sequence.length==0){
return false;
}
return judge(sequence,0,sequence.length-1);
}
//用于判断该该子树右子树是否比根结点大,左子树是否比根结点小
public boolean judge(int[] seq,int start,int root){
//写出递归终止条件,一定是>=,不能只写>,因为当只有左子树时,会出现start>root情况,
//具体往下看**处
if(start>=root){
return true;
}
int i=start;
//从前往后找,找到根结点在序列中的位置(此时根节点左边都比根节点小)
while(i>=start && i<root){
//最后一个即为根结点root,如果大于root,则该位置i为右子树序列的开始位置
if(seq[i]>seq[root]){
break;
}
i++;
}
int boudaryIndex=i;
//继续判断根结点右边,应该都要比根节点大。
//如果是从后往前找(此时根节点右边都比根节点大),要继续判断根节点左边都比根结点小。
while(i<root){
if(seq[i]<seq[root]){
return false;
}
i++;
}
//左右分治,不断递归,直到返回结果
//**当只有左子树时,boudaryIndex=root,root-1<boudaryIndex,
//会出现start>root情况,由于没有关于start>root的终止操作,此时右半部分会不断递归,直到栈溢出
return judge(seq,start,boudaryIndex-1)&& judge(seq,boudaryIndex,root-1);
}
}