Leetcode-每日一题【剑指 Offer 33. 二叉搜索树的后序遍历序列】

news/2024/11/17 22:38:56/

题目

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

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

     5
    / \
   2   6
  / \
1   3

示例 1:

输入: [1,6,3,2,5]
输出: false

示例 2:

输入: [1,3,2,6,5]
输出: true

提示:

  1. 数组长度 <= 1000

解题思路

1.题目要求我们判断所给数组是不是某二叉搜索树的后序遍历结果,我们使用递归来实现。

2.首先我们观察一下正确的二叉搜索树的后序遍历的结果,

举个例子:

对于上面给出的二叉搜索树,我们可以观察到在遍历结果中根节点在最后一位,因此我们可以轻松的找到根节点root(6)。

 

因为二叉搜索树有一个特性就是根节点的左孩子都小于根节点,根节点的右孩子都大于根节点。因此当我们找到第一个大于根节点的元素时(7),就意味着我们找到了左右孩子的分界点。第一个大于根节点的元素之前 [3,4,5] 是根节点的左孩子,剩下的元素除了我们找到的最后一位是根节点,其余的都是根节点的右孩子 [7,8,9]。

 

 这个时候我们就要判断所给数组是否为正确,我们需要从找到的第一个大于根节点的元素,也就是 7 开始,判断除去根节点的后面的元素 [7,8,9] 中是否存在有小于根节点的元素。因为我们知道从7开始都是属于根节点的右子树肯定都是大于根节点的元素。若存在小于根节点的元素,那么就说明这个数组是有误的,我们就要返回false。

当检查没有问题时,我们就需要递归得去判断6的左右子树是否正确,我们将左右子树传入递归函数中,左子树 [3,5,4] 的最后一个元素依旧是根节点(4),然后找到第一个大于根节点的元素(5),判断从此元素(5)开始向后遍历到根节点(4)的前一个元素是否有元素小于根节点(4),若没有就继续递归,直到所有元素都遍历结束。

代码实现

class Solution {public boolean verifyPostorder(int[] postorder) {if(postorder == null){return true;}return f(postorder, 0, postorder.length - 1);}boolean f(int[] postorder, int i, int j){if(i >= j){return true;}int root = postorder[j];int p = i;//获取第一个大于等于root的元素while(postorder[p] < root) p++;for(int k = p; k < j; k++){//查找p ~ j - 1是否存在小于root的元素if(postorder[k] < root){return false;}}return f(postorder, i, p - 1 ) && f(postorder, p, j - 1);}
}

测试结果

 


http://www.ppmy.cn/news/1049957.html

相关文章

嵌入式基础知识-中断处理过程

本篇来介绍中断&#xff0c;这是计算机系统以及嵌入式系统的重要概念。 1 中断基本概念 中断是CPU对系统发生的某个事件作出的一种反应。 中断的一些基本概念&#xff1a; 中断源&#xff1a;引起中断的事件称为中断源中断请求&#xff1a;中断源向CPU提出处理的请求称为中断…

C++编写算法实现串的置换操作Replace( S, T, R), 即将串S中所有与串T相等的子串置换为串R。

题目&#xff1a;.编写算法实现串的置换操作Replace( S, T, R), 即将串S中所有与串T相等的子串置换为串R。 实现代码&#xff1a; #include<iostream> #include <stdio.h> using namespace std; #define MaxSize 100 typedef struct { char data[MaxSize];int le…

数据结构 - 线性表的顺序存储

一、顺序存储定义&#xff1a; 把逻辑上相邻的数据元素存储在物理上相邻的存储单元中。简言之&#xff0c;逻辑上相邻&#xff0c;物理上也相邻顺序表中&#xff0c;任一元素可以随机存取&#xff08;优点&#xff09; 二、顺序表中元素存储位置的计算 三、顺序表在算法中的实…

[WMCTF 2023] crypto

似乎退步不了&#xff0c;这个比赛基本不会了&#xff0c;就作了两个简单题。 SIGNIN 第1个是签到题 from Crypto.Util.number import * from random import randrange from secret import flagdef pr(msg):print(msg)pr(br"""........ …

将eNSP Pro部署在华为云是什么体验

eNSP Pro简介 eNSP Pro 是华为公司数据通信产品线新推出的数通设备模拟器&#xff0c;主要应用在数据通信技能培训&#xff0c;为使用者提供华为数据通信产品设备命令行学习环境。 具备的能力 多产品模拟能力&#xff1a;支持数据通信产品线NE路由器、CE交换机、S交换机、AR…

【源码篇】基于ssm+bootstrap+jquery的学生成绩管理系统

系统介绍 基于ssmbootstrapjquery的学生成绩管理系统一共分为六大模块&#xff0c;分别是用户管理、课程管理、班级管理、学籍管理、学费管理、成绩管理 用户管理&#xff1a; 1、用户信息预览&#xff1a;查询并根据姓名搜索系统用户。 2、新增用户信息&#xff1a;添加系…

css的常见伪元素使用

1.first-line 元素首行设置特殊样式。 效果演示&#xff1a; <div class"top"><p>可以使用 "first-line" 伪元素向文本的首行设置特殊样式。<br> 换行内容 </p></div> .top p::first-line {color: red;} 2.first-lette…

免费内网穿透哪个好?

神卓互联是一种内网穿透技术&#xff0c;可以实现在外部网络访问公司内网的服务。通过建立一个加密的通道&#xff0c;神卓互联可以将内网的动态IP绑定技术&#xff0c;实现远程访问。 使用神卓互联进行内网穿透的步骤如下&#xff1a; 在公司内网中&#xff0c;安装并配置神卓…