题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
public class verifySquenceOfBST {
public boolean VerifySquenceOfBST(int [] sequence){
if(sequence.length==0)
return false;
return IsTreeBST(sequence,0,sequence.length-1) ;
}
public boolean IsTreeBST(int [] sequence,int start,int end) {
if(end<=start)
return true; //并不是输入合法的判断条件,而是递归结束条件
//判断左子树的节点小于根节点,并记下右子树的第一个元素位置,记为i
int i=start;
for(;i<end;i++){
if(sequence[i]>sequence[end]){
break;
}
}
//判断右子树上的元素是否都满足添加
for(int j=i;j<end;j++){
if(sequence[j]<sequence[end])
return false;
}
//判断左子树和右子树是否是二叉搜索树
return IsTreeBST(sequence,start,i-1)&&IsTreeBST(sequence,i,end-1);//出错:特别注意这种start和end,千万不要直接取0和length-1
}
}
该题非常容易出错,出错的地方主要在
IsTreeBST方法中的第一个判断:
if(end<=start)
return true;
为什么返回的是true,而不是false。因为这个条件是
递归结束条件,而不是
输入合法性的判断条件。况且在
VerifySquenceOfBST函数中调用
IsTreeBST(sequence,0,sequence.length-1)已经确保了输入的合法性。
调用IsTreeBST的三种情况:
//第一种 全是右子树 i=start 调用最后的IsTreeBST左子树直接返回true 右子树递归递归最后root-1=i=start return true
//第二种全是左子树 i=root 最后的IsTreeBST左子树递归递归 最后root-1=start返回true 右子树直接返回true
//第三种 左子树右子树都有正常递归 继续直到进入前面两种情况之一