• 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;
        }
    }
  • 相关阅读:
    android activity lifecycle
    android hal 分析
    android hardware.c 源码分析
    linux cpio
    android boot.img unpack pack
    imx6 android4.2 编译
    repo 安装
    repo manifest.xml 分析
    ElasticSearch 5.0.0 安装部署常见错误或问题
    elasticsearch 安装(基于java运行环境)
  • 原文地址:https://www.cnblogs.com/juniorMa/p/16384479.html
Copyright © 2020-2023  润新知