zoukankan      html  css  js  c++  java
  • 剑指offer——二叉搜索树的后序遍历序列

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

    输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。

    这里遇到的问题就是,传递的子数组怎么递归的传递下去,(Java基础不好,所以很多接口与方法都不熟悉)

    看过答案之后,用的是Arrays的方法Arrays.copyOfRange(arrays, 1, 9);很神奇

    还有就是左右两边子树判断的情况是不一样的,所以自己想的就很尴尬,不知道怎么处理

    看了别人的答案之后,很神奇,先处理左边子树,在处理右边子树,然后再递归的进行左右子树内部的处理。

    import java.util.Arrays;
    public class Solution {
        public boolean VerifySquenceOfBST(int [] sequence) {
            if(sequence.length == 0) return false;
            int len = sequence.length;
            int root = sequence[len - 1];
            int i = 0;
            for(; i < len - 1; i++){
                if(root < sequence[i]) break;
            }
            int j = i;
            for(; j < len - 1; j++){
                if(root > sequence[j]) return false;
            }
            boolean leftIsBST = true;
            if(i > 0){
                leftIsBST = VerifySquenceOfBST(Arrays.copyOfRange(sequence, 0, i));
            }
            boolean rightIsBST = true;
            if(j < len - 1){
                rightIsBST = VerifySquenceOfBST(Arrays.copyOfRange(sequence, i, j));
            }
            return leftIsBST && rightIsBST;
        }
    }
    

      

    下面这一种方式不是很理解

    看的别人的 i 定义为一个右边子树的开始结点,但是想不明白为什么要遍历一遍数组,来找出root>sequence[j]的个数来作为i

    import java.util.Arrays;
    public class Solution {
        public boolean VerifySquenceOfBST(int [] sequence) {
            if(sequence.length == 0) return false;
            int len = sequence.length;
            int root = sequence[len - 1];
            int i = 0;
            for(int j = 0; j < len - 1; j++){
                if(root > sequence[j]) i++;
            }
            if(i == 0){
                VerifySquenceOfBST(Arrays.copyOfRange(sequence, 0, len - 1));
            }else{
                for(int j = i; j < len - 1; j++){
                    if(root > sequence[j]) return false;
                }
                VerifySquenceOfBST(Arrays.copyOfRange(sequence, 0, i));
                VerifySquenceOfBST(Arrays.copyOfRange(sequence, i, len - 1));
            }
            return true;
        }
    }
    

      

     重新写了一个不传递数组,直接传子数组的位置大小的

    public class Solution {
        public boolean VerifySquenceOfBST(int [] sequence) {
            if(sequence.length == 0) return false;
            int len = sequence.length;
            return postTran(sequence, len - 1, 0, len - 2 );
        }
        
        public boolean postTran(int[] sequence, int len, int low, int high){
            if(len <= 0 || low >= high) return true;
            int index = low;
            while(index < len){
                if(sequence[index] > sequence[len]) break;
                index++;
            }
            int flag = index;
            while(index < len){
                if(sequence[index] < sequence[len]) return false;
                index++;
            }
            return postTran(sequence, flag - 1, low, flag - 2) 
                && postTran(sequence, high-1, flag, high-2);
        }
    }
    

      

  • 相关阅读:
    web三大组件的注册
    springboot 支持 jsp
    redis 储存session
    springboot 做切面
    springboot web静态资源访问
    springboot加载外部配置文件
    springboot 两种配置文件,application.properties ,application.yml ,注入值的两种方式,主动@ConfigurationProperties与被动@value,和其他注解Conditional,PropertySource
    今日立春,SpringBoot! 简单springboot项目搭建开始。
    linux防火墙开放端口
    Don’t try to create file system on an “extended” partition
  • 原文地址:https://www.cnblogs.com/SkyeAngel/p/8572331.html
Copyright © 2011-2022 走看看