题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。
/**
* 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。
如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。
* @author dbw
*
*/
public boolean VerifySquenceOfBST(int [] sequence) {
return recur(sequence, 0,sequence.length-1);
}
public boolean recur(int [] sequence,int start,int end){
//若后序遍历序列为空,则不满足条件直接返回false
if(sequence==null||sequence.length==0){
return false;
}
//若只有一个节点
if(start>=end){
return true;
}
int i=start;
//找到第一个大于根节点的节点m,然后开始划分为两个左右子树区间 [start,m-1] 到[m,end]
while(sequence[i]<sequence[end]) i++;
//若找到第m个节点
int m=i;
//继续往后遍历,是否满足右子树的所有节点都大于
while(sequence[i]>sequence[end]) i++;
//判断该层二叉树是否为二叉搜素树依据有以下两条件:
//1: i == end ?
//2:子左子树区间[start, m-1]中是否也满足以m-1为根节点的二叉搜索树;
//子右子树区间[m,end-1]是否也满足以end-1为根节点的二叉搜索树,这就用到递归了
return (i==end)&&(recur(sequence, start, m-1))&&(recur(sequence,m, end-1));
}