题目:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回 true ,否则返回 false 。假设输入的数组的任意两个数字都互不相同。
数据范围: 节点数量 0 \le n \le 10000≤n≤1000 ,节点上的值满足 1 \le val \le 10^{5}1≤val≤105 ,保证节点上的值各不相同
要求:空间复杂度 O(n)O(n) ,时间时间复杂度 O(n^2)O(n2)
提示:
1.二叉搜索树是指父亲节点大于左子树中的全部节点,但是小于右子树中的全部节点的树。
2.该题我们约定空树不是二叉搜索树
3.后序遍历是指按照 “左子树-右子树-根节点” 的顺序遍历
4.参考下面的二叉搜索树,示例
示例:
输入:{8,8,7,9,2,#,#,#,#,4,7},{8,9,2}
返回值:true
思路:
二叉搜索是左根右递增的
而后序则是 左右根,也就是满足 小大中
从头遍历,直到比根大也就是数组最后一个数,这时候遍历的就是左子树,都比根小
还要判断右子树是不是都比根大。
再去递归左右子树就可以了
复杂度:
时间复杂度:遍历O(n)
空间复杂度:递归最差是O(n),一般为树高
代码:
public class Solution {
public boolean VerifySquenceOfBST(int [] sequence) {
//二叉搜索树满足中序递增的特点
//后序是左右根 也就是小大中
//先区分左右子树
if(sequence == null ||sequence.length ==0) return false;
return recur(sequence,0,sequence.length-1);
}
private boolean recur(int [] sequence,int l,int r){
//返回条件
if(l>=r) return true;
int num = l;
//根是最后一个,找到左子树的右边界
while(sequence[num]<sequence[r]) num++;
int bound = num; //此时bound为右子树起点
//往右边走如果都满足右子树大于根就是对的
while(sequence[num]>sequence[r]) num++;
return num==r && recur(sequence,l,bound-1) && recur(sequence,bound,r-1);
}
}