题目
题号:23
题目名:二叉搜索树的后序遍历序列
编程语言
Java
题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
初次思路
首先要了解什么是二叉搜索树
二叉搜索树简而言之就是一个树结构的根节点要大于所有他的左子树的值,小于右子树的值
而后序遍历就是【左,右,根】的输出顺序
然后进行递归校验
要注意的是,题目没给出非空校验的条件,这里与递归函数的非空校验不一样,所以换了个函数去调用递归,不然通过不了用例
吐槽一下,牛客题目描述属实没有力扣精细,总能让人会错意
解题代码
public class Solution {
public boolean VerifySquenceOfBST(int [] sequence) {
/**
* 1.后序遍历遵循左右根的排序
* 2.逆序查找的第一个就是当前树的根
* 3.逆序查找,比根大的都是右子树,剩下都是左子树
* 4.对子树递归查找
*/
if(sequence==null||sequence.length==0) return false;
return findSquenceOfBST(sequence);
}
private boolean findSquenceOfBST(int[] sequence) {
if(sequence.length <=1) return true;
int len = sequence.length;
int root = sequence[len - 1];//找到根
int point =-1;//设置左右子树分界点
for (int i = len - 2; i >= 0; i--) {
//找到分界点
if(sequence[i]<root) {
point=i;
break;
}
}
if(point == -1) return true;//表示全是右子树
for (int j = point; j >= 0; j--) {
if(sequence[j]>root) return false;
}
return findSquenceOfBST(Arrays.copyOfRange(sequence,0,point+1))&&findSquenceOfBST(Arrays.copyOfRange(sequence,point+1,len-1));
}
}