首页 > 编程语言 >剑指 Offer 33. 二叉搜索树的后序遍历序列(java解题)

剑指 Offer 33. 二叉搜索树的后序遍历序列(java解题)

时间:2023-04-22 22:47:08浏览次数:56  
标签:java recur Offer 33 int 数组 end start postorder

目录

1. 题目

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

参考以下这颗二叉搜索树:

     5
    / \
   2   6
  / \
 1   3
示例 1:
输入: [1,6,3,2,5]
输出: false
示例 2:
输入: [1,3,2,6,5]
输出: true

提示:

数组长度 <= 1000

作者:Krahets
链接:https://leetcode.cn/leetbook/read/illustration-of-algorithm/5vwxx5/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

2. 解题思路

使用递归分治的思路:

  • 根据最后一个值x,划分为左右子数组;
    • 查找比x大的元素,第一个比x大的元素下标为i,在此处划分数组[start,i-1][i,end]
  • 检查左右数组:左数组的元素均小于x,右数组的元素均大于x
    • 由于左数组元素和x的大小关系已经确定,只需要检查右数组和x的大小关系即可。
    • 如果右数组不符合要求,直接返回false;否则继续执行下一步
  • 对左右子数组,重复上述步骤;

终止条件:数组为空或者只有一个元素,返回true

3. 数据类型功能函数总结

//数组
int len=arrayname.length;//数组长度

4. java代码

class Solution {
    public boolean verifyPostorder(int[] postorder) {
        return recur(postorder,0,postorder.length-1);
    }
    public boolean recur(int[] postorder,int start,int end){
        if(end-start<=1){
            return true;
        }
        else{
            int root_val=postorder[end];
            int i=start;
            for(i=start;i<end;i++){
                if(postorder[i]>root_val){
                    break;
                }
            }
            //得到i,左右数组[start,i-1],[i,end-1]
            //检查左右数组
            int flag=0;
            for(int j=i;j<end && flag==0;j++){
                if(postorder[j]<root_val){
                    flag=1;
                }
            }
            if(flag==0){
                return  recur(postorder,start,i-1)&&recur(postorder,i,end-1);
            }
            else{
                return false;
            }

        }
    }
}

5. 踩坑小记

递归调用,显示StackOverflowError

递归函数的部分为:

if(flag==0){
    return  recur(postorder,start,i-1)&&recur(postorder,i,end-1);
}

而我一开始写成了:

if(flag==0){
    return  recur(postorder,start,i-1)&&recur(postorder,i,end);
}

然后一直报错显示StackOverflowError,后来发现是右数组划分的时候,传入end就会导致后序遍历一直停留在和根节点的比较上,无法退出循环,导致栈溢出。

标签:java,recur,Offer,33,int,数组,end,start,postorder
From: https://www.cnblogs.com/CrazyPixel/p/17344317.html

相关文章

  • 《面试1v1》java泛型
    我是javapub,一名Markdown程序员从......
  • Java reflect
    Java反射机制面试题1、什么是反射机制?JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。静态编译和动态编译静态编译:......
  • Java接口
    Java接口Java接口的概述接口是一种公共的规范标准只要符合规范标准,就可以给大家通用生活举例接口的定义和基本格式接口是多个类的公共规范接口是一种引用数据类型,里面最重要的方法是抽象方法接口的格式publicinterface接口名称{接口内容}接口可以包含常量......
  • java maven pom指定main class类
    pom文件中增加 <build><finalName>entrance</finalName><!--这里是生成的jar包名字--><plugins><plugin><groupId>org.apache.maven.plugins</groupId><arti......
  • Java学习(1)
    一、Java的基础语法1.变量和数据类型在Java中,变量是用来存储数据的容器,可以存储各种类型的数据。Java中的变量分为两类:基本数据类型变量和引用数据类型变量。(1)基本数据类型(PrimitiveDataTypes)整数类型:byte、short、int、long浮点类型:float、double字符类型:char布尔......
  • Java核心机制
    Java核心机制1.Java虚拟机1.JVM是一个虚拟的计算机,具有指令集并使用不同的存储区域。负责执行指令,管理数据,内存,寄存器。2.对于不同的平台,有不同的虚拟机。3.Java虚拟机机制屏蔽了底层运行平台的差别,实现了“一次编译,到处运行”。2.垃圾自动回收1.垃圾回收:不再使用的内存空间......
  • 【已解决】:java.sql.SQLException 问题
    本文目录一、Bug描述二、定位报错点三、解决方案四、注意事项及原理总结:写在后面的话一、Bug描述今天做项目开发的时候,发现了这个Bug,话不多说,直接定位Bug原理+解决!java.sql.SQLException:java.lang.RuntimeException:java.sql.SQLException:CannotissueexecuteUpdate()fo......
  • 设计模式-模板模式在Java中的使用示例-悍马模型制造示例
    场景设计模式-模板模式在Java中的使用示例:设计模式-模板模式在Java中的使用示上面整理了模板模式的使用示例,为加强理解特记录另一个使用示例,以下示例摘自设计模式之禅第二版。模板方法模式定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即......
  • java -- 网络编程
    软件结构C/S结构:全称为Client/Server结构,是指客户端和服务器结构。常见程序有QQ、迅雷等软件。B/S结构:全称为Browser/Server结构,是指浏览器和服务器结构。常见浏览器有谷歌、火狐等。网络通讯协议网络通信协议:通信协议是对计算机必须遵守的规则,只有遵守这些规则,计算机之间......
  • Java异常类层次结构?
    Throwable是Java语言中所有错误与异常的超类。Error类及其子类:程序中无法处理的错误,表示运行应用程序中出现了严重的错误。Exception程序本身可以捕获并且可以处理的异常。Exception这种异常又分为两类:运行时异常和编译时异常。运行时异常都是RuntimeException类......