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

news2024/11/25 1:04:17

题目链接

牛客在线oj题——二叉搜索树的后序遍历序列

题目描述

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

数据范围: 节点数量 0≤n≤1000 ,
节点上的值满足1≤val≤10^5 ,保证节点上的值各不相同
要求:空间复杂度 O(n) ,时间时间复杂度 O(n^2 )

提示:

  1. 二叉搜索树是指父亲节点大于左子树中的全部节点,但是小于右子树中的全部节点的树。
  2. 该题我们约定空树不是二叉搜索树
  3. 后序遍历是指按照 “左子树-右子树-根节点” 的顺序遍历
  4. 参考下面的二叉搜索树,示例 1
    在这里插入图片描述

题目示例

示例1

输入:
[1,3,2]

返回值:
true

说明:
是上图的后序遍历 ,返回true

示例2

输入:
[3,1,2]

返回值:
false

说明:
不属于上图的后序遍历,从另外的二叉搜索树也不能后序遍历出该序列 ,因为最后的2一定是根节点,前面一定是孩子节点,可能是左孩子,右孩子,根节点,也可能是全左孩子,根节点,也可能是全右孩子,根节点,但是[3,1,2]的组合都不能满足这些情况,故返回false

示例3

输入:
[5,7,6,9,11,10,8]

返回值:
true

解题思路

二叉搜索树的特点是父亲节点大于左子树所有节点的值,小于右子树所有节点的值

而后序遍历则是先遍历左子树,再遍历右子树,然后输出父节点的值

定义数组的第一个元素下标为start,最后一个元素下标为end。
首先拿到数组中最后一个节点end下标对应的的值,这个值就是父节点的值,然后从左到右遍历数组,当遇到比父节点的值更大的元素停止,这个节点下标为i
可以确定[start, i - 1]为当前遍历序列的左子树序列,而[i, end - 1]则是当前遍历序列的右子树序列

继续遍历[i, end - 1]序列,如果有元素小于父节点的值,说明这个序列不满足二叉搜索树的性质,返回false

需要注意的是,当前只是确定了当前序列是否满足二叉搜索树的性质,而我们需要判断所有的子树是否都满足二叉搜索树的性质,也就是说上述过程我们分别要对[start, i - 1]序列和[i, end - 1]序列分别再次验证

因此,可以通过递归来验证,最后的终止条件是:当start <= end时,返回true

完整代码

public class Solution {
    public boolean VerifySquenceOfBST(int [] sequence) {
        if(sequence == null || sequence.length == 0){
            return false;
        }

        int start = 0;
        int end = sequence.length - 1;
        return VerifySquenceOfBSTHelper(sequence, start, end);
    }

    private boolean VerifySquenceOfBSTHelper(int[] sequence, int start, int end) {
        if(start >= end){
            return true;
        }
        
        int root = sequence[end];
        int i = start;
        while(i < end && sequence[i] < root){
            i++;
        }
        for(int j = i; j < end; j++){
            if(sequence[j] < root){
                return false;
            }
        }
        return VerifySquenceOfBSTHelper(sequence, start, i - 1) && VerifySquenceOfBSTHelper(sequence, i, end - 1);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/456856.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PLECS的基本介绍

PLECS的基本介绍 一&#xff1a;PLECS的基本介绍简单说明二&#xff1a;多功能的辅助工具三&#xff1a;主要功能介绍1、独特的热分析功能2、功能强大的示波器3、极快的仿真速度4、强大的波形分析工具5、C 语言控制器6、丰富的元件库 一&#xff1a;PLECS的基本介绍简单说明 1&…

QMS-云质说质量 - 7 IATF 16949哪个条款严重不符合项最多?

云质QMS原创 转载请注明来源 作者&#xff1a;王洪石 引言 AIAG 《质量2020》报告的数据是否让你惊讶&#xff1f; AIAG与德勤合作发布的汽车行业《质量2020》报告指出&#xff0c;"OEMs和供应商都将问题解决和CSR&#xff08;Customer Specific Requirement顾客特定要求…

What...MiniGPT-4居然开源了,提前感受 GPT-4 的图像对话能力

说在前面的话&#xff1a; 一个月前&#xff0c;OpenAI向外界展示了GPT-4如何通过手绘草图直接生成网站&#xff0c;令当时的观众瞠目结舌。 在GPT-4发布会之后&#xff0c;相信大家对ChatGPT的对话能力已有所了解。圈内的朋友们应该已经亲身体验过无论是文本生成、编写代码&…

涨点技巧:基于Yolov5/Yolov7的困难样本挖掘---LRM loss,提升难样本检测精度

1.hard example mining(困难样本挖掘)✨✨✨ 困难例挖掘方法通常可以提高目标检测器的性能,因为它受到不平衡训练集的影响。为了通过RoI正确地挖掘困难例,引入了在线困难例挖掘(OHEM)方法[15]。该方法建议只考虑对反向传播最有利的RoI。给出最高损失值的RoI被认为是最难的…

【汽车品牌案例 Objective-C语言】

一、刚才,我给大家说了一下这个单元格的重用,接下来,我给大家再做一个案例, 1.再做一个什么案例呢,还是显示那个汽车品牌, 咱们上午是不是做过一个那个汽车品牌的展示了,做过那个展示,那是简单的一个展示,咱们再做一个,使用另外一个不同的一个plist文件,car_total.…

必应,百度,神马头条,搜狗专用站长seo推送工具大全

软件介绍&#xff1a; 百度开始打击滥用api问题&#xff0c;针对这个问题已经开发了拟人推送系列功能&#xff0c;放心使用。 五合一高效推送软件&#xff0c;目前支持百度&#xff0c;神马&#xff0c;必应&#xff0c;搜狗&#xff0c;头条&#xff0c;谷歌六大搜索引擎同步…

setup,ref,reactive

初识setup 1.理解:Vue3.0中一个新的配置项&#xff0c;值为一个函数。 2.setup是所有Composition API(组合API)“表演的舞台”。 3.组件中所用到的:数据、方法等等&#xff0c;均要配置在setup中。 4.setup函数的两种返回值: 1.若返回一个对象&#xff0c;则对象中的属性、…

IDEA(七) 使用UML类图

目录 1.相关快捷键1.1 查看快捷键1.2 其他快捷键1.3 分析类图1.4 定制展示类中的内容1.5 适配窗口和1:1展示1.6 定制布局1.7 其他设置 1.相关快捷键 1.1 查看快捷键 Ctrl Alt U &#xff1a;以弹窗的形式查看UML类图。Ctrl Shift Alt U &#xff1a;以标签的形式查看UML…

C learning_9 (函数篇)

目录 函数 函数的概念 函数的作用 函数的分类 函数的参数 函数的调用 函数 函数的概念 概念&#xff1a;C语言中的函数是一种封装了一定功能的代码块&#xff0c;可以在程序的任意位置调用。 返回值类型 函数名(参数列表) { 函数体 return 返回值; } 1.返回值类型指定了…

Vue的路由实现:hash模式 和 history模式原理及区别

目录标题 1、hash模式2、history模式 Vue-Router有两种模式: ** hash 模式和 history**模式。默认的路由模式是hash模式。 1、hash模式 简介&#xff1a;hash模式是开发中默认的模式&#xff0c;它的URL带着一个#&#xff0c;例如:http://www.abc.com/#/vue&#xff0c;它的…

从广交会,看懂海尔智家逆势增长的秘密

中国企业的全球化战略应从何处、以何种方式推进&#xff1f;作为行业全球化最彻底的企业&#xff0c;海尔智家是个很好的参考。 4月15日&#xff0c;在第133届中国进出口贸易交易会&#xff08;以下简称“广交会”&#xff09;上&#xff0c;海尔智家展示了其扎根本土&#xf…

Learning Dynamic Facial Radiance Fields for Few-Shot Talking Head Synthesis 笔记

Learning Dynamic Facial Radiance Fields for Few-Shot Talking Head Synthesis 笔记 摘要 Talking head synthesis is an emerging technology with wide applications in film dubbing, virtual avatars and online education. Recent NeRF-based methods generate more n…

举个栗子~Tableau 技巧(253):让筛选器只显示全部以及需要的类别

用户反馈了一个需求&#xff1a;我的业务数据有很多类别&#xff0c;但其实经常查看的只有几个&#xff0c;Tableau 筛选器能不能设置一下&#xff0c;只显示全部和经常查看的那几个类别&#xff1f; 这个是可以实现的&#xff01;如下示例&#xff0c;数据类别有&#xff1a;…

好用的思维导图软件有哪些

ProcessOn &#xff0c;一款让“工具回归工具、让你回归你的"软件&#xff01; 当“在线”成为当今时代的主流时、 如果让你选择一款好用的思维导图软件、 你希望Ta 是什么样的&#xff1f; ProcessOn&#xff01; 它可以是你的待办清单、笔记工具、社区分享工具、PPT演…

vector(入门知识点)

目录 vector的介绍 ​编辑 例&#xff1a;遍历 拷贝&#xff1a; 初始化&#xff1a; 反向迭代器&#xff1a; 扩容&#xff1a; insert与erase vector的介绍 例&#xff1a;遍历 拷贝&#xff1a; 初始化&#xff1a; &#xff08;10个1&#xff09; vector<int>注意…

Jetpack Compose 中使用分页 API 调用的无限滚动

Jetpack Compose 中使用分页 API 调用的无限滚动 最近&#xff0c;我在DashCoin 的硬币屏幕上添加了一个带有分页 API 调用的无限滚动。它使浏览硬币列表变得非常困难&#xff0c;并且确实减少了初始加载时间&#xff0c;比以前少了。如果没有正确实施&#xff0c;实施无限滚动…

基数排序详解

本期内容是对之前排序内容的一部分补充&#xff0c;需要有一定的基础 (14条消息) 万字解析&#xff0c;带你深入掌握多种排序算法&#xff01;-C语言-CSDN博客 基数排序 基数排序&#xff08;Radix Sorting&#xff09;是和前面所述各类排序方法完全不相同的一种排序方法。从…

【C++】面试官:你小子,继承与多态的题你都会

文章目录 前言一、理论知识类二、编程题选择类 前言 上一篇文章我们详细了介绍了多态&#xff0c;用汇编一步一步的查看了多态的实现原理&#xff0c;讲解了这么多理论知识该做一些面试题了&#xff0c;这些面试题都是历年来大厂所出的笔试题&#xff0c;希望大家可以把我今天…

php动态密码和加密解密函数的使用(动态密码、Discuz核心函数AuthCode、任意输入密码验证)

php加密解密的使用 一、项目说明二、项目分析1.js外部文件2.HTML容器构建3.layui前端验证4.php后端验证封装函数密码验证规则strpos内置函数 三、经典的核心加密函数1.Discuz!开发之核心加密解密函数2.常用简单加密解密函数 一、项目说明 在开发大屏时&#xff0c;需要在前端输…

【Linux】4、Linux 的用户、用户组和权限等

目录 一、Linux 的 root 用户二、切换用户相关命令(1) su(2) sudo 三、用户和用户组(1) 用户组命令(2) 用户相关命令(3) 查看当前系统中有哪些用户和用户组 四、认识权限控制信息(1) 权限控制信息分析(2) chmod 命令(3) 权限的数字序号(4) chown 命令 一、Linux 的 root 用户 …