JZ33 二叉搜索树的后序遍历序列
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回 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)
要求:空间复杂度 O(n)O(n) ,时间时间复杂度 O(n^2)O(n2)
提示:
1.二叉搜索树是指父亲节点大于左子树中的全部节点,但是小于右子树中的全部节点的树。
2.该题我们约定空树不是二叉搜索树
3.后序遍历是指按照 “左子树-右子树-根节点” 的顺序遍历
4.参考下面的二叉搜索树,示例 1
示例1
输入:
[1,3,2]
返回值:
true
说明:
是上图的后序遍历 ,返回true
import java.util.*; public class Solution { /* 思路:由于题目给出的是二叉搜索树的后续校验。 所以,我们应该充分的往二叉搜索树中的性质方面考虑,并且利用它的性质解题 性质:对于任何一个根来说,根的左边全部小于根,根的右边全部大于根。并且后续数组中尾元素一定是根! 所以!我们只需要找一个分界值,这个分界值可以用来区分根的左右子树。 然后分别递归校验左右子树即可。(因为左右子树校验思路一样,所以可以递归) 代码步骤就是: 1)通过根节点,来找一个分界值,用来区分左右子树(当分界值找到后。那么对于分界值的左边所有元素就是当前根的左子树,分界值以及分界值的右边就是当前根的右子树。) 2)提前校验右子树中是否全部元素大于根,只要有一个不是,提前终止程序! 3)递归校验左子树。递归校验右子树! 递归终止条件:当数组中为空就return true; */ public boolean VerifySquenceOfBST(int [] sequence) { if(sequence.length==0) return false; return chek(sequence); } public boolean chek(int[] sequence){ // 递归终止条件:数组为空停止。 if(sequence.length<1) return true; int index=0; // 获取根节点 int root = sequence[sequence.length-1]; // 先找一个左右子树的分界值 while(index<sequence.length-1){ if(sequence[index]>root){ break; } index++; } // 程序能执行到此处,说明index 左边的元素全是左子树, index 右边的元素全是右子树 // 先校验右子树中是否全部元素大于根。 int temp = index; while(temp<sequence.length-1){ if(sequence[temp]<root){ return false; } temp++; } // 递归校验左子树 boolean left = chek(Arrays.copyOfRange(sequence,0,index)); // 递归校验右子树 boolean right = chek(Arrays.copyOfRange(sequence,index,sequence.length-1)); return left && right; } }