二叉搜索树的后序遍历序列
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
思路:
- 后续遍历最后一个节点必定为根节点。
- 将前面所有<该节点的值存入左子树
- 一旦遇到>的值,将从这个节点开始到结尾前一个的值存入右子树(一旦在这里遍历出小于根节点的值,则说明此树不能满足二叉搜索树所有小于根节点的值都在左,大于都在右这一性质,返回false);
- 如果遍历完没有问题,用递归的方法继续遍历左右子树,直到遍历完全部的左右子树,返回结果。
public boolean VerifySquenceOfBST(int [] sequence) {
if (sequence == null || sequence.length ==0){
return false;
}
int length = sequence.length;
int root = sequence[length-1];
int endl = 0;
for (int i = 0 ; i < length-1 ; i++){
if (sequence[i] > root){
break;
}
endl = i;
}
int startR = endl+1;
for (int j = endl+1; j < length-1 ; j++){
if (sequence[j] < root){
return false;
}
}
boolean left = true;
if (endl > 0 ){
int[] leftSequence = new int[endl+1];
for (int i = 0 ; i <= endl ;i++ ){
leftSequence[i] = sequence[i];
}
left = VerifySquenceOfBST(leftSequence);
}
boolean rigtht =true;
if ( startR < length-1 ){
int[] rigthtSequence = new int[length-startR];
for (int i = 0 ; i < endl ;i++ ){
rigthtSequence[i] = sequence[startR+i];
}
rigtht = VerifySquenceOfBST(rigthtSequence);
}
return left&&rigtht;
}