关于递归的题目就是可能会造成死循环,即无限递归。为避免无限递归,有两点要注意。
- 一定要有递归出口,即递归结束的条件
- 对于有左右边界的递归函数,防止递归的参数一直相同
问题定义:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
版本一:
public boolean VerifySquenceOfBST(int [] sequence) {
if (sequence.length==0) return false;
if (sequence.length==1) return true;
return help(sequence, 0, sequence.length);
}
public boolean help(int [] sequence, int left, int right){
//取原始序列的最后一个节点作为根节点
if (left>=right) return true;
int root = sequence[right-1];
int i = left;
for(;i<right-1;i++){
if(sequence[i]>root) break;
}
for(int j = i;j<right-1;j++){
if(sequence[j]<root) return false;
}
return help(sequence, left, i) && help(sequence, i, right-1);
//这会造成重复,原因在于,当i==right-1时说明这棵二叉树没有右子树,即本不该再考虑右子树的递归,当i==left,则没有左子树,不用判断左子树。即以上两种情况都只返回一个函数就行了
}
public static void main(String[] args) {
POstOrder so = new POstOrder();
int[] res = {5,7,6,9,11,10,8};
System.out.println(so.help(res,0,res.length));
}
}
版本二:
public class POstOrder {
public boolean VerifySquenceOfBST(int [] sequence) {
if (sequence.length==0) return false;
if (sequence.length==1) return true;
return help(sequence, 0, sequence.length);
}
public boolean help(int [] sequence, int left, int right){
//取原始序列的最后一个节点作为根节点
if (left>=right) return true;
int root = sequence[right-1];
int i = left;
for(;i<right-1;i++){
if(sequence[i]>root) break;
}
for(int j = i;j<right-1;j++){
if(sequence[j]<root) return false;
}
if (i==right-1 || i == left) return help(sequence, left, right-1);
else return help(sequence, left, i) && help(sequence, i, right-1);
}
public static void main(String[] args) {
POstOrder so = new POstOrder();
int[] res = {5,7,6,9,11,10,8};
System.out.println(so.help(res,0,res.length));
}
}