题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出True,否则输出False。假设输入的数组的任意两个数字都互不相同。
思路:
已知条件:后序序列最后一个值为root;二叉搜索树左子树值都比root小,右子树值都比root大。
- 确定root;
- 遍历序列(除去root结点),找到第一个大于root的位置,则该位置左边为左子树,右边为右子树;
- 遍历右子树,若发现有小于root的值,则直接返回false;
- 分别判断左子树和右子树是否仍是二叉搜索树(即递归步骤1、2、3)。
测试用例:
功能测试:
- 完全二叉树;所有节点只有左子树的二叉树;所有节点只有右子树的二叉树。
- 特殊测试:输入的根节点为空;二叉树只有一个节点。
public class test_thirty_three {
public boolean VerifySquenceOfBST(int[] sequence){
if (sequence == null || sequence.length<=0)return false;
return isSquenceOfBST(sequence, 0, sequence.length-1);
}
private boolean isSquenceOfBST(int[] sequence, int left, int right) {
//递归结束的条件
if (left >= right)
return true;
//确定根节点的值
int root = sequence[right];
//在二叉搜索树中左子树节点的值小于根节点,i为右子树的第一个节点
int i = left;
for (; i<right-1; i++){
if (sequence[i]>root)
break; //这里返回的是i的值
}
//在二叉搜索树中右子树节点的值大于根节点,如果不是,返回false
for (int j = i; j<right-1; j++){
if (sequence[j]<root)
return false;
}
//分治算法把二叉树分为左子树和右子树两部分,分别判断
//判断左子树是不是二分搜索树
boolean isSquenceOfBST_left = true;
isSquenceOfBST_left = isSquenceOfBST(sequence, left, i-1);
//判断右子树是不是二分搜索树
boolean isSequenceOfBST_right = true;
isSequenceOfBST_right = isSquenceOfBST(sequence, i, right-1);
return (isSquenceOfBST_left && isSequenceOfBST_right);
}
}