题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No;
假设输入的数组的任意两个数字都互不相同。
二叉搜索树(BST)的定义
1. 若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
2. 若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
3. 任意节点的左、右子树也分别为二叉查找树;
4. 没有键值相等的节点;
解题思路
1.首先,要从二叉搜索树的特征入手;
2.这道题很自然地可以想到用递归的方式去做;当然,不用递归也是可以的;
3.如果它是一个二叉搜索树的后序遍历序列,那么这个序列的最后那个数一定是这个子树的root节点;去掉这个root节点,前的序列能分成两个部分,一个小于root,一个大于root;只要把这两个序列的分界点找到,用递归的方法分别对他们进行处理即可;
public boolean VerifySquenceOfBST(int [] sequence) {
if(sequence == null || sequence.length == 0){
return false;
}
if(sequence.length == 1){
return true;
}
return verify(sequence, 0, sequence.length-1);
}
public boolean verify(int[] sequence,int star,int end){
if(star >= end){
return true; //注意这个递归结束条件
}
int rootVal = sequence[end];
int curIndex = star;
while (curIndex < end && sequence[curIndex] < rootVal){
curIndex++; //从前面往后,前面那部分都是小于rootVal的
}
for (int i = curIndex+1;i < end; i++){
if (sequence[i] < rootVal){
return false; //后面那部分的所有元素必须都大于rootVal
}
}
return verify(sequence,star,curIndex) && verify(sequence, curIndex+1, end-1);
}