【LeetCode】Day210-二叉搜索树的后序遍历序列

news2025/1/17 15:56:07

题目

剑指 Offer 33. 二叉搜索树的后序遍历序列【中等】

题解

二叉搜索树性质:左<根,右>根
后序遍历序:左右根

递归分治

利用递归求解,[ i,j ]区间中找到第一个比根节点大的元素,下标为m,则[i,m-1]为左子树 ,[m,j-1]为右子树,下标 j 为根。
指针为p,返回值为 p==j && dfs(i,m-1) && dfs(m,j-1)。

class Solution {
    public boolean verifyPostorder(int[] postorder) {
        int n=postorder.length;
        return dfs(postorder,0,n-1);
    }
    public boolean dfs(int[] postorder,int i,int j){
        if(i>=j)
            return true;
        int p=i;
        //找到第一个比根节点大的元素
        while(postorder[p]<postorder[j])
            p++;
        int m=p;
        while(postorder[p]>postorder[j])
            p++;
        return p==j&&dfs(postorder,i,m-1)&&dfs(postorder,m,j-1);            
    }
}

时间复杂度: O ( n 2 ) O(n^2) O(n2)

空间复杂度: O ( n ) O(n) O(n)

单调栈

观察下面这棵树,
在这里插入图片描述
它的后序遍历序:[3,6,5,9,8,11,13,12,10],如果倒序过来就会变成:[10,12,13,11,8,9,5,6,3]

两个规律:

  • 如果arr[i]<arr[i+1],那么arr[i+1]一定是arr[i]的右子节点
  • 如果arr[i]>arr[i+1],那么arr[i+1]一定是arr[0]……arr[i]中某个节点的左子节点,并且这个值是大于arr[i+1]中最小的(如8号root右子中的最左子11号)

根据以上规律,建升序的单调栈

class Solution {
    public boolean verifyPostorder(int[] postorder) {
        int n=postorder.length,parent=Integer.MAX_VALUE;
        Deque<Integer>stack=new LinkedList<>();
        for(int i=n-1;i>=0;i--){
            int cur=postorder[i];
            //当如果前节点小于栈顶元素,说明栈顶元素和当前值构成了倒序
            //说明当前节点是前面某个节点的左子节点,我们要找到他的父节点
            while(!stack.isEmpty()&&cur<stack.peek()){
                parent=stack.pop();
            }
            if(cur>parent)
                return false;
            stack.push(cur);
        }
        return true;
    }
}

时间复杂度: O ( n ) O(n) O(n)

空间复杂度: O ( n ) O(n) O(n)

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

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

相关文章

10月17日|实验报告|paddle paddle|概念辨析

目录 一、安装paddle paddle 第一章 零基础入门深度学习 机器学习和深度学习综述 1.人工智能、机器学习、深度学习的关系 1.1人工智能(Artificial Intelligence,AI) 1.2机器学习 1.2.1机器学习的实现 1.2.2机器学习方法论 1.3深度学习​​​​​​​ 一、安装paddle…

Transformer的位置编码笔记(positional encoding)

一、为什么Transformer需要对输入进行位置编码因为Transformer的输入并没有内涵位置信息&#xff0c;同样的词在不同位置&#xff0c;或者同一个序列以不同顺序输入&#xff0c;对应的词间都会得到相同的注意力权重和输出&#xff0c;但是在NLP领域&#xff0c;词的顺序会极大地…

P20 PyTorch 反向传播算法

前言&#xff1a;反向传播是深度学习的基础核心&#xff0c;如果掌握了这个&#xff0c;其它的模型会很容易理解。这里面结合前面的多层感知机&#xff0c;深入了解一下权重数是如何更新的目录&#xff1a;1: 多层感知机节点间的权重系数更新2&#xff1a; 反向传播的基本思路3…

基于VS Code的插件开发(基础篇)

一、基础介绍 VSCode 采用了 Electron&#xff0c;在语言上&#xff0c;VSCode 使用了自家的 TypeScript 语言开发。Electron是基于 Chromium 和 Node.js&#xff0c;使用 JavaScript, HTML 和 CSS 构建跨平台的桌面应用&#xff0c;它兼容 Mac、Windows 和 Linux&#xff0c;…

认识DOM和架构

DOM 代表文档对象模型&#xff0c;是 HTML 和 XML 文档的接口(API)。当浏览器第一次读取(解析)HTML文档时&#xff0c;它会创建一个大对象&#xff0c;一个基于 HTM L文档的非常大的对象&#xff0c;这就是DOM。它是一个从 HTML 文档中建模的树状结构。DOM 用于交互和修改DOM结…

SpreadJS 16.0 中文版在线电子表设计预览EXCEL-Crack

SpreadJS 纯前端表格控件 - V16.0 新特性--内容摘自互联网 新文件结构是 SpreadJS 近几个版本中最为重要的架构级更新。这种新文件结构可以大大提高导入大型 Excel 文件的性能&#xff0c;同时在保存时创建更小、优化更好的文件。 在 V15.0 及更早的版本中&#xff0c;Spread…

android事件分发机制源码分析

没什么用的前言责任链设计模式流程图源码分析 没什么用的前言 事件分发机制是面试中一道必问的题目&#xff0c;而我的应对方式则是&#xff0c;在网络上找一些博客看看&#xff0c;然后做一些笔记&#xff0c;最后在面试时将我自己记住的内容说出来。这种方式本身没有太大的…

Editor工具开发实用篇:EditorGUI/EditorGUILayout的区别和EditorGUILayout的方法介绍

目录 一&#xff1a;EditorGUI和EditorGUILayout区别 二&#xff1a;EditorGUILayout 1.EditorGUILayout.BeginFadeGroup(float value); 2.EditorGUILayout.BeginHorizontal EditorGUILayout.BeginVertical 3.EditorGUILayout.BeginScrollView 4.EditorGUILayout.BeginT…

携手中国联通丨美格智能成为中国联通物联网产业联盟苏州分联盟副理事长单位

2月24日&#xff0c;联通数科物联网2023年巡展活动首场——中国联通物联网生态合作伙伴大会暨中国联通物联网产业联盟苏州分联盟成立仪式在苏州成功举办。本次活动由联通数字科技有限公司、中国联通物联网产业联盟联合主办&#xff0c;江苏省物联网服务协会指导&#xff0c;中国…

MySQL运维篇之日志

01、日志 1.1、错误日志 错误日志是MySQL中最重要的日志之一&#xff0c;它记录了当mysqld启动和停止时&#xff0c;以及服务器在运行过程中发生任何严重错误时的相关信息。当数据库出现任何故障导致无法正常使用时&#xff0c;建议首先查看此日志。 该日志是默认开启的&…

微服务之Nacos注册与配置

&#x1f3e0;个人主页&#xff1a;阿杰的博客 &#x1f4aa;个人简介&#xff1a;大家好&#xff0c;我是阿杰&#xff0c;一个正在努力让自己变得更好的男人&#x1f468; 目前状况&#x1f389;&#xff1a;24届毕业生&#xff0c;奋斗在找实习的路上&#x1f31f; &#x1…

短视频美颜sdk人脸编辑技术详解、美颜sdk代码分析

短视频美颜sdk中人脸编辑技术可以将人像风格进行转变&#xff0c;小编认为这也是未来的美颜sdk的一个重要发展方向&#xff0c;下文小编将为大家讲解一下短视频美颜sdk中人脸编辑的关键点。 一、人脸编辑的细分关键点 1、年龄 通过更改人脸的年龄属性&#xff0c;可用于模仿人…

「TCG 规范解读」TCG 软件栈 TSS (下)

可信计算组织(Ttrusted Computing Group,TCG)是一个非盈利的工业标准组织,它的宗旨是加强在相异计算机平台上的计算环境的安全性。TCG于2003年春成立,并采纳了由可信计算平台联盟(the Trusted Computing Platform Alliance,TCPA)所开发的规范。现在的规范都不是最终稿,都…

【Redis】Redis线程IO模型与基于文件的网络通信模型(Redis专栏启动)

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;2022年度博客之星全国TOP3&#xff0c;专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化&#xff0c;文章内容兼具广度、深度、大厂技术方案&#xff0c;对待技术喜欢推理加验证&#xff0c;就职于…

Unity 渲染顺序

Unity中的渲染顺序自上而下大致分为三层渲染优先级 Camera depth > Sorting Layer > Order in Layer > RenderQueueCamera depth:越小越优先&#xff08;大的显示在小的前面&#xff09;如图&#xff1a;尽管Sphere距离摄像机较远&#xff0c;但由于Camera_Sphere dep…

Linux 常用 API 函数

文章目录1. 系统调用与库函数1.1 什么是系统调用1.2 系统调用的实现1.3 系统调用和库函数的区别2. 虚拟内存空间3. 错误处理函数4. C 库中 IO 函数工作流程5. 文件描述符6. 常用文件 IO 函数6.1 open 函数6.2 close 函数6.3 write 函数6.4 read 函数6.5 lseek 函数7. 文件操作相…

算法笔记(十六)—— 有序表(红黑树,AVL树,Size-balance树,跳表),一文搞定!

有序表所有的操作都是O(logN)级别&#xff08;红黑树&#xff0c;AVL树&#xff0c;Size-balance树&#xff0c;跳表&#xff09;。 红黑树&#xff0c;AVL树&#xff0c;Size-balance树都属于平衡搜索二叉树&#xff08;BST&#xff09;。 搜索二叉书&#xff08;不保证平衡性…

OSPF -- (开放式最短路径优先协议)(公共协议)

OSPF -- &#xff08;开放式最短路径优先协议&#xff09;&#xff08;公共协议&#xff09; 1、属性&#xff1a;无类别链路状态IGP协议 无类别&#xff1a;更新携带精确掩码 链路状态&#xff1a;共享拓扑&#xff08;共享LSA&#xff09;本地计算路由IGP&#xff1a; 基于…

EasyExcel

文章目录&#x1f68f; EasyExcel&#x1f680; 一、初识EasyExcel&#x1f6ac; 1、Apache POI&#x1f6ad; 1.1 学习使用成本较高&#x1f6ad; 1.2 POI的内存消耗较大&#x1f6ad; 1.3 特点&#x1f6ac; 2、EasyExcel&#x1f6ad; 2.1 重写了POI对07版Excel的解析&#…

Nginx学习整理

Nginx学习第一章 Nginx概述1.1、Nginx概述1.2、Nginx官网1.3、Nginx用处第二章 Nginx单实例安装2.1、环境说明2.2、安装依赖2.3、Nginx下载2.4、Nginx解压2.5、Nginx安装2.6、Nginx命令2.7、开放防火墙2.8、启动后效果第三章 Nginx正向代理、反向代理3.1、概述3.2、反向代理配置…