JZ33 二叉搜索树的后序遍历序列

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回 true ,否则返回 false 。假设输入的数组的任意两个数字都互不相同。
 
数据范围: 节点数量 0 \le n \le 10000n1000 ,节点上的值满足 1 \le val \le 10^{5}1val105 ,保证节点上的值各不相同
要求:空间复杂度 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;
    }
}

 

posted on 2022-06-17 09:20  MaXianZhe  阅读(25)  评论(0编辑  收藏  举报

导航