题目描述:
https://www.nowcoder.com/practice/a861533d45854474ac791d90e447bafd
思路:首先判断是不是空树
其次对空树进行检查
在检查函数中,找到根节点的左子树和右子树,在递归判断左子树和右子树是否合法
check的工作:从尾巴开始走,找到第一个比根节点小的位置,那么前面的就是左子树,后面的就是右子树。可以看到右子树都是比根节点的大,只要判断左子树是不是有比根节点大的,如果有就不合法。
判断完根节点的左子树和右子树之后,再递归对左子树和右子树进行递归判断
import java.util.Arrays;
public class Solution {
public boolean VerifySquenceOfBST(int [] sequence) {
// 思路:找到根节点,然后找到比根节点小的那个分割点,分成左右子树,在判断子树有没有大于根的,右子树有没有小于根的,判断合法性
if(sequence.length==0) return false;
return check(sequence);
}
boolean check(int []sequence){
// 检查完了
if(sequence.length==0)return true;
int index=sequence.length-1;
int root=sequence[sequence.length-1];//根节点
while(index>=0){
if(sequence[index]<root){
break;
}
index--;
}
// 记录到了分割点的左子树的最尾巴
int temp=index;
while(temp>=0){
if(sequence[temp]>=root){
return false;//说明他的左子树不对
}
temp--;
}
//他的左子树和右子树满足根的条件,再递归看左子树和右子树是不是满足后序遍历的条件
boolean left=check(Arrays.copyOfRange(sequence,0,index+1));
boolean right=check(Arrays.copyOfRange(sequence,index+1,sequence.length-1));
return left&&right;
}
}