题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
解题思路
- 二叉搜索树:左子树上值都比根节点的小,右子树上的值都比根节点大;左右子树也是二叉搜索树。
- 后序遍历是左右中的顺序。
- 找到根节点:序列的最后一个元素;
- 比根节点小的节点是在左子树上,比根节点大的值是在右子树上;
- 左右子树递归调用上述两步。
代码
import java.util.Arrays;
public class Solution {
public boolean VerifySquenceOfBST(int [] sequence) {
if(sequence.length==0 || sequence==null){
return false;
}
int n=sequence.length;
int root=sequence[n-1];
//左右子树的值是在0-n-2的坐标上,最后一个是根节点
//1.寻找左子树上的值(就是比根节点小的值)
int i=0;
for(;i<n-1;i++){
if(sequence[i]>root){
break;
}
}
//2.寻找右子树上的值(就是比根节点大的值)
int j=i;
for(;j<n-1;j++){
if(sequence[j]<root){
return false;
}
}
//3.判断左子树是不是二叉搜索树(递归) (可能没有左子树上的节点,所以先设置为true)
boolean left=true;
if(i>0){
left=VerifySquenceOfBST(Arrays.copyOfRange(sequence,0,i));//坐标包含左边,不包含右边
}
//4.判断右子树上是不是二叉搜索树(递归)(可能没有右子树上的节点,所以先设置为true)
boolean right=true;
if(i<n-1){
right=VerifySquenceOfBST(Arrays.copyOfRange(sequence,i,n-1));
}
return left && right;
}
}