输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
分析:后序遍历的序列中,最后一个数字是树的根节点的值,数组中的前面数字可以分为两部分:第一部分是左子树的节点值,他们都比根节点的值要小;第二部分是右子树的节点值,他们都比根节点的值要大,我们可以先找出第一个比根节点大的值,即为右子树的第一个节点,往后遍历如果出现比根节点小的值,那么不是搜索二叉树的后序遍历,接着判断左子树是否为二叉搜索树,右子树是否为二叉搜索树。
public boolean VerifySquenceOfBST(int [] sequence) {
if(sequence==null||sequence.length<=0){
return false;
}
return judgeSequenceOfBTS(sequence,0,sequence.length-1);
}
public boolean judgeSequenceOfBTS(int [] arr,int start,int end){
int root=arr[end];
int i=0;
//找出第一个右节点
while(arr[i]<root){
i++;
}
int j=i;
//找出二叉搜索树右子节点的值大于根节点
for(;j<end;j++){
if(arr[j]<root){
//出现小于根节点的值就不是搜索二叉树后序遍历
return false;
}
}
//判断左子子树是否是二叉搜索树
boolean left=true;
if(i>start){
left=judgeSequenceOfBTS(arr,start,i-1);
}
//判断右子树是否是二叉搜索树
boolean right=true;
if(i<end){
right=judgeSequenceOfBTS(arr,i,end-1);
}
return left&&right;
}