一刷328-递归recur-剑指 Offer 33. 二叉搜索树的后序遍历序列(m)
题目:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。
假设输入的数组的任意两个数字都互不相同。
-----------
示例:参考以下这颗二叉搜索树:5/ \2 6/ \1 3示例 1:
输入: [1,6,3,2,5]
输出: false示例 2:
输入: [1,3,2,6,5]
输出: true提示:
数组长度 <= 1000
----------------
思考:
后序遍历定义: [ 左子树 | 右子树 | 根节点 ] ,即遍历顺序为 “左、右、根” 。
二叉搜索树定义: 左子树中所有节点的值 << 根节点的值;右子树中所有节点的值 >> 根节点的值;其左、右子树也分别为二叉搜索树。
根据二叉搜索树的定义,可以通过递归,判断所有子树的 正确性 (即其后序遍历是否满足二叉搜索树的定义)
若所有子树都正确,则此序列为二叉搜索树的后序遍历。
-----------
递归解析:
1、终止条件: 当 i≥j ,说明此子树节点数量 ≤1 ,无需判别正确性,因此直接返回 true;
2、递推工作:1、划分左右子树: 遍历后序遍历的 [i, j] 区间元素,寻找 第一个大于根节点 的节点,索引记为 m 。此时,可划分出左子树区间 [i,m-1]、右子树区间 [m, j - 1]、根节点索引 j 。2、判断是否为二叉搜索树:1、左子树区间 [i, m - 1] 内的所有节点都应 << postorder[j]。而第 1.划分左右子树 步骤已经保证左子树区间的正确性,因此只需要判断右子树区间即可。2、右子树区间 [m, j-1]内的所有节点都应 >> postorder[j]。实现方式为遍历,当遇到]≤postorder[j] 的节点则跳出;则可通过 p = j判断是否为二叉搜索树。
3、返回值: 所有子树都需正确才可判定正确,因此使用 与逻辑符 && 连接。1、p = j: 判断 此树 是否正确。2、recur(i, m - 1) : 判断 此树的左子树 是否正确。3、recur(m, j - 1): 判断 此树的右子树 是否正确。
-----------------
复杂度分析:
时间复杂度 O(N^2) : 每次调用 recur(i,j)减去一个根节点,因此递归占用 O(N) ;最差情况下(即当树退化为链表),每轮递归都需遍历树所有节点,占用 O(N) 。
空间复杂度 O(N) : 最差情况下(即当树退化为链表),递归深度将达到 N 。
-----------------
class Solution {public boolean verifyPostorder(int[] postorder) {return recur(postorder, 0, postorder.length - 1);//递归}private boolean recur(int[] postorder, int i, int j) {if (i >= j) return true;//特判:此时此子树节点数量 <=1 无需判别正确性int curIndex = i;while (postorder[curIndex] < postorder[j]) curIndex++;int m = curIndex;//while循环找到第一个大于根节点的节点,索引为mwhile (postorder[curIndex] > postorder[j]) curIndex++;//确保右子树[m, j-1]的值都大于根节点return curIndex == j && recur(postorder, i, m - 1) && recur(postorder, m, j - 1);}
}
/**return p == j && recur(postorder, i, m - 1) && recur(postorder, m, j - 1);p == j: while (postorder[p] > postorder[j]) p++; 当p为j-1时,满足循环条件 p++,结果是p == j通过p==j 判断是否为二叉搜索树
recur(postorder, i, m - 1): 判断左子树是否正确 i---m - 1
recur(postorder, m, j - 1): 判断右子树是否正确 m---j - 1*/
LC
一刷328-递归recur-剑指 Offer 33. 二叉搜索树的后序遍历序列(m)相关推荐
- 【LeetCode】剑指 Offer 33. 二叉搜索树的后序遍历序列
[LeetCode]剑指 Offer 33. 二叉搜索树的后序遍历序列 文章目录 [LeetCode]剑指 Offer 33. 二叉搜索树的后序遍历序列 package offer;public cl ...
- 剑指 Offer 33. 二叉搜索树的后序遍历序列
剑指 Offer 33. 二叉搜索树的后序遍历序列 原始题目链接:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-hou-xu-bian- ...
- 【超100%解法】剑指 Offer 33. 二叉搜索树的后序遍历序列
立志用最少的代码做最高效的表达 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果.如果是则返回 true,否则返回 false.假设输入的数组的任意两个数字都互不相同. 示例 1: 输入: ...
- 二叉排序树的后序遍历序列必然是递增的_剑指offer 33——二叉搜索树的后序遍历序列...
本题主要在于考察对二叉搜索树和后序遍历的理解. 原题 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果.如果是则返回 true,否则返回 false.假设输入的数组的任意两个数字都互不相同 ...
- 【分治】剑指 Offer 33. 二叉搜索树的后序遍历序列
题目描述 (中等)输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果.如果是则返回 true,否则返回 false.假设输入的数组的任意两个数字都互不相同. 参考以下这颗二叉搜索树: 5/ ...
- 2021-08-24剑指 Offer 33. 二叉搜索树的后序遍历序列
将二叉树划分为左右子树,分别对左右子树进行验证是否为二叉树, 根节点的下标为i, 右子树的开端为第一个大于根节点的数字m, 则左边的子树为[0,m-1],右边的子树的下标为[m,i-1] (这个不对, ...
- 剑指offer之二叉搜索树的后序遍历序列
剑指offer之二叉搜索树的后序遍历序列 欢迎关注作者博客 简书传送门 题目 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个 ...
- 剑指offer 33. 二叉搜索树的后序遍历
声明:本系列博客是对何海涛<剑指offer>的关键点总结. 1.问题描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果,如果是返回true,否则返回false.假设输入的数 ...
- 剑指笔记——33.二叉搜索树的后序遍历序列
题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No. 假设输入的数组的任意两个数字都互不相同. 思路:在这个题中要注意是二叉搜索树,二叉搜索树满足左 ...
最新文章
- 向oracle中导入*.csv文件
- 36 岁开发者应聘被拒,这 3 位 50 岁程序员的生存秘籍送给你!
- Mysql5.7安装错误处理与主从同步及!
- 30 整数中1出现的次数(从1到n整数中1出现的次数)这题很难要多看*
- mysql读取整张表_mysql 一个表里的信息是读取另一张表来的
- 德哥的PostgreSQL私房菜 - 史上最屌PG资料合集
- paddlepaddle-VisualDL2.0对项目进行可视化调参
- python office库_python库编程.os平台.office平台
- 游戏自审自查报告_开发的射箭小游戏上线了,分享一下我在开发过程中遇到的问题...
- java.lang.NoSuchMethodError: javax.servlet.http.HttpServletRequest.isAsyncStarted()Z 的解决
- 信息学奥赛一本通 1059:求平均年龄 | OpenJudge NOI 1.5 01
- 如何将FLex AIR运行环境与AIR程序一起打包
- jQuery插件管理方案
- FileUpload1.PostedFile.FileName 获取的文件名
- Windows Dll 动态加载
- 怎么把图片做成gif动图?三步搞定gif在线制作
- Python 解决报错NameError: name ‘LEFT‘ is not defined
- 数据库篇-mysql主备搭建
- 运用CS-LBP提取裂纹的梯度特征
- 英文Essay写作诀窍讲解
热门文章
- EF Core学习笔记:关于主键 对IGuidGenerator的理解
- 挖机的涡轮增压器为什么会窜(漏)机油呢?有什么后果?
- Schedutil governor情景分析
- 账号密码注册登录忘记密码测试用例(挺详细的)
- 极简主义linux桌面,Ubuntu 16.04/17.10/18.04安装Zafiro极简图标主题
- H3C云实验室模拟器
- U8cloud V3.6 3.5 3.2 3.1 3.0 3.1 U8C
- RFID相关知识总结(超高频UHF)
- watch取消配对怎么重新配对_苹果Apple Watch重新配对方法_Apple Watch怎么重新配对-硬件之家...
- 前端学习---使用原生AJAX从本地txt文件中获取数据